Compilare un client di ricerca app console in C#
Avviso
Il 30 ottobre 2020 le API di Ricerca Bing spostate dai servizi di intelligenza artificiale di Azure ai servizi Ricerca Bing. Questa documentazione viene fornita solo per informazioni di riferimento. Per la documentazione aggiornata, vedere la documentazione dell'API di ricerca Bing. Per istruzioni sulla creazione di nuove risorse di Azure per la ricerca Bing, vedere Creare una risorsa Ricerca Bing tramite la Azure Marketplace.
Questa esercitazione mostra come compilare una semplice app della console .NET Core che consenta agli utenti di eseguire query sull'API Ricerca Web Bing e di visualizzare i risultati classificati.
Questa esercitazione illustra come:
- Eseguire una semplice query per l'API Ricerca Web Bing
- Visualizzare i risultati della query in un ordine classificato
Prerequisiti
Per proseguire con l'esercitazione è necessario:
- Una sottoscrizione di Azure: creare un account gratuitamente
- Dopo aver creato la sottoscrizione di Azure, per ottenere la chiave e l'endpoint. Al termine della distribuzione, fare clic su Vai alla risorsa.
- L'IDE di Visual Studio.
Creare un nuovo progetto di app console
In Visual Studio creare un progetto con Ctrl
+Shift
+N
.
Nella finestra di dialogo Nuovo progetto fare clic su Visual C# > Windows Classic Desktop > Console App (.NET Framework).
Assegnare all'applicazione il nome MyConsoleSearchApp e fare clic su OK.
Aggiungere il pacchetto NuGet JSON.net al progetto
JSON.net consente di lavorare con le risposte JSON restituite dall'API. Aggiungere il pacchetto NuGet al progetto:
- In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere Gestisci pacchetti NuGet.
- Nella scheda Sfoglia cercare
Newtonsoft.Json
. Selezionare la versione più recente e fare clic su Installa. - Fare clic su OK nella finestra Rivedi modifiche.
- Chiudere la scheda di Visual Studio denominata NuGet: MyConsoleSearchApp.
Aggiungere un riferimento a System.Web
Questa esercitazione si basa sull'assembly System.Web
. Aggiungere un riferimento a questo assembly per il progetto:
- In Esplora soluzioni fare clic con il pulsante destro del mouse su Riferimenti e scegliere Aggiungi riferimento
- Selezionare Assembly > Framework, quindi scorrere verso il basso e selezionare System.Web
- Selezionare OK.
Aggiungere alcune istruzioni per l'uso necessarie
Il codice in questa esercitazione richiede altre tre istruzioni per l'uso. Aggiungere queste istruzioni sotto le istruzioni using
esistenti nella parte superiore di Program.cs:
using System.Web;
using System.Net.Http;
Chiedere una query all'utente
In Esplora soluzioni aprire Program.cs. Aggiornare il metodo Main()
:
static void Main()
{
// Get the user's query
Console.Write("Enter Bing query: ");
string userQuery = Console.ReadLine();
Console.WriteLine();
// Run the query and display the results
RunQueryAndDisplayResults(userQuery);
// Prevent the console window from closing immediately
Console.WriteLine("\nHit ENTER to exit...");
Console.ReadLine();
}
Questo metodo:
- Chiede una query all'utente
- Chiama
RunQueryAndDisplayResults(userQuery)
per eseguire la query e visualizzare i risultati - Attende l'input dell'utente per evitare che la finestra della console si chiuda immediatamente.
Cercare i risultati della query usando l'API Ricerca Web Bing
Successivamente, aggiungere un metodo che esegua una query per l'API e visualizzi i risultati:
static void RunQueryAndDisplayResults(string userQuery)
{
try
{
// Create a query
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "<YOUR_SUBSCRIPTION_KEY_GOES_HERE>");
var queryString = HttpUtility.ParseQueryString(string.Empty);
queryString["q"] = userQuery;
var query = "https://api.cognitive.microsoft.com/bing/v7.0/search?" + queryString;
// Run the query
HttpResponseMessage httpResponseMessage = client.GetAsync(query).Result;
// Deserialize the response content
var responseContentString = httpResponseMessage.Content.ReadAsStringAsync().Result;
Newtonsoft.Json.Linq.JObject responseObjects = Newtonsoft.Json.Linq.JObject.Parse(responseContentString);
// Handle success and error codes
if (httpResponseMessage.IsSuccessStatusCode)
{
DisplayAllRankedResults(responseObjects);
}
else
{
Console.WriteLine($"HTTP error status code: {httpResponseMessage.StatusCode.ToString()}");
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
Questo metodo:
- Crea un
HttpClient
per eseguire la query per l'API Ricerca Web - Imposta l'intestazione HTTP
Ocp-Apim-Subscription-Key
, che Bing usa per autenticare la richiesta - Esegue la richiesta e usa JSON.net per deserializzare i risultati
- Chiama
DisplayAllRankedResults(responseObjects)
per visualizzare tutti i risultati in un ordine classificato
Assicurarsi di impostare il valore di Ocp-Apim-Subscription-Key
sulla chiave di sottoscrizione.
Visualizzare i risultati classificati
Prima di capire come visualizzare i risultati in ordine classificato, esaminare un esempio di risposta della ricerca Web:
{
"_type" : "SearchResponse",
"webPages" : {
"webSearchUrl" : "https:\/\/www.bing.com\/cr?IG=70BE289346...",
"totalEstimatedMatches" : 982000,
"value" : [{
"id" : "https:\/\/api.cognitive.microsoft.com\/api\/v7\/#WebPages.0",
"name" : "Contoso Sailing Club - Seattle",
"url" : "https:\/\/www.bing.com\/cr?IG=70BE289346ED4594874FE...",
"displayUrl" : "https:\/\/contososailingsea...",
"snippet" : "Come sail with Contoso in Seattle...",
"dateLastCrawled" : "2017-04-07T02:25:00"
},
{
"id" : "https:\/\/api.cognitive.microsoft.com\/api\/7\/#WebPages.6",
"name" : "Contoso Sailing Lessons - Official Site",
"url" : "http:\/\/www.bing.com\/cr?IG=70BE289346ED4594874FE...",
"displayUrl" : "https:\/\/www.constososailinglessonsseat...",
"snippet" : "Contoso sailing lessons in Seattle...",
"dateLastCrawled" : "2017-04-09T14:30:00"
},
...
],
"someResultsRemoved" : true
},
"relatedSearches" : {
"id" : "https:\/\/api.cognitive.microsoft.com\/api\/7\/#RelatedSearches",
"value" : [{
"text" : "sailing lessons",
"displayText" : "sailing lessons",
"webSearchUrl" : "https:\/\/www.bing.com\/cr?IG=70BE289346E..."
}
...
]
},
"rankingResponse" : {
"mainline" : {
"items" : [{
"answerType" : "WebPages",
"resultIndex" : 0,
"value" : {
"id" : "https:\/\/api.cognitive.microsoft.com\/api\/v7\/#WebPages.0"
}
},
{
"answerType" : "WebPages",
"resultIndex" : 1,
"value" : {
"id" : "https:\/\/api.cognitive.microsoft.com\/api\/v7\/#WebPages.1"
}
}
...
]
},
"sidebar" : {
"items" : [{
"answerType" : "RelatedSearches",
"value" : {
"id" : "https:\/\/api.cognitive.microsoft.com\/api\/v7\/#RelatedSearches"
}
}]
}
}
}
L'oggetto JSON rankingResponse
(documentazione) descrive l'ordine di visualizzazione appropriato per i risultati di ricerca. Include uno o più dei gruppi seguenti, in ordine di priorità:
-
pole
: i risultati della ricerca da rendere più visibili (visualizzati ad esempio sopra la riga principale e la barra laterale). -
mainline
: I risultati della ricerca da visualizzare nella riga principale. -
sidebar
: I risultati della ricerca da visualizzare nella barra laterale. Se non ci sono barre laterali, visualizzare i risultati sotto la linea principale.
La risposta classificata JSON può includere uno o più gruppi.
In Program.cs aggiungere il metodo seguente per visualizzare i risultati nell'ordine classificato correttamente:
static void DisplayAllRankedResults(Newtonsoft.Json.Linq.JObject responseObjects)
{
string[] rankingGroups = new string[] { "pole", "mainline", "sidebar" };
// Loop through the ranking groups in priority order
foreach (string rankingName in rankingGroups)
{
Newtonsoft.Json.Linq.JToken rankingResponseItems = responseObjects.SelectToken($"rankingResponse.{rankingName}.items");
if (rankingResponseItems != null)
{
foreach (Newtonsoft.Json.Linq.JObject rankingResponseItem in rankingResponseItems)
{
Newtonsoft.Json.Linq.JToken resultIndex;
rankingResponseItem.TryGetValue("resultIndex", out resultIndex);
var answerType = rankingResponseItem.Value<string>("answerType");
switch (answerType)
{
case "WebPages":
DisplaySpecificResults(resultIndex, responseObjects.SelectToken("webPages.value"), "WebPage", "name", "url", "displayUrl", "snippet");
break;
case "News":
DisplaySpecificResults(resultIndex, responseObjects.SelectToken("news.value"), "News", "name", "url", "description");
break;
case "Images":
DisplaySpecificResults(resultIndex, responseObjects.SelectToken("images.value"), "Image", "thumbnailUrl");
break;
case "Videos":
DisplaySpecificResults(resultIndex, responseObjects.SelectToken("videos.value"), "Video", "embedHtml");
break;
case "RelatedSearches":
DisplaySpecificResults(resultIndex, responseObjects.SelectToken("relatedSearches.value"), "RelatedSearch", "displayText", "webSearchUrl");
break;
}
}
}
}
}
Questo metodo:
- Si sovrappone ai gruppi
rankingResponse
contenuti nella risposta - Visualizza gli elementi in ciascun gruppo chiamando
DisplaySpecificResults(...)
In Program.cs aggiungere i due metodi seguenti:
static void DisplaySpecificResults(Newtonsoft.Json.Linq.JToken resultIndex, Newtonsoft.Json.Linq.JToken items, string title, params string[] fields)
{
if (resultIndex == null)
{
foreach (Newtonsoft.Json.Linq.JToken item in items)
{
DisplayItem(item, title, fields);
}
}
else
{
DisplayItem(items.ElementAt((int)resultIndex), title, fields);
}
}
static void DisplayItem(Newtonsoft.Json.Linq.JToken item, string title, string[] fields)
{
Console.WriteLine($"{title}: ");
foreach( string field in fields )
{
Console.WriteLine($"- {field}: {item[field]}");
}
Console.WriteLine();
}
Questi metodi operano insieme per restituire i risultati di ricerca nella console.
Eseguire l'applicazione
Eseguire l'applicazione. L'output dovrebbe essere simile al seguente:
Enter Bing query: sailing lessons seattle
WebPage:
- name: Contoso Sailing Club - Seattle
- url: https://www.bing.com/cr?IG=70BE289346ED4594874FE...
- displayUrl: https://contososailingsea....
- snippet: Come sail with Contoso in Seattle...
WebPage:
- name: Contoso Sailing Lessons Seattle - Official Site
- url: http://www.bing.com/cr?IG=70BE289346ED4594874FE...
- displayUrl: https://www.constososailinglessonsseat...
- snippet: Contoso sailing lessons in Seattle...
...
Passaggi successivi
Altre informazioni sull'uso della classificazione per visualizzare i risultati.