Criar um cliente de pesquisa de aplicações de consola em C#
Aviso
A 30 de outubro de 2020, as APIs de Pesquisa do Bing passaram dos serviços de IA do Azure para os Serviços Pesquisa do Bing. Esta documentação é fornecida apenas para referência. Para obter documentação atualizada, veja a documentação da API de pesquisa do Bing. Para obter instruções sobre como criar novos recursos do Azure para a pesquisa do Bing, veja Criar um recurso de Pesquisa do Bing através do Azure Marketplace.
Este tutorial mostra como criar uma aplicação de consola .NET Core simples que permite aos utilizadores consultar a API de Pesquisa na Web do Bing e apresentar resultados classificados.
Este tutorial mostra como:
- Fazer uma consulta simples à API de Pesquisa na Web do Bing
- Apresentar resultados da consulta por ordem classificada
Pré-requisitos
Para acompanhar o tutorial, precisa de:
- Uma subscrição do Azure – Criar uma gratuitamente
- Assim que tiver a sua subscrição do Azure, Pesquisa do Bing no portal do Azure para obter a chave e o ponto final. Depois de implementar, clique em Ir para recurso.
- O IDE do Visual Studio.
Criar um novo projeto da Aplicação de Consola
No Visual Studio, crie um projeto com Ctrl
+Shift
+N
.
Na caixa de diálogo Novo Projeto, clique em Visual C# > Windows Classic Desktop > Console App (.NET Framework).
Dê um nome à aplicação MyConsoleSearchApp e, em seguida, clique em OK.
Adicionar o pacote NuGet JSON.net ao projeto
JSON.net permite-lhe trabalhar com as respostas JSON devolvidas pela API. Adicione o pacote NuGet ao projeto:
- Em Explorador de Soluções clique com o botão direito do rato no projeto e selecione Gerir Pacotes NuGet....
- No separador Procurar , procure
Newtonsoft.Json
. Selecione a versão mais recente e, em seguida, clique em Instalar. - Clique no botão OK na janela Rever Alterações .
- Feche o separador Do Visual Studio intitulado NuGet: MyConsoleSearchApp.
Adicionar uma referência a System.Web
Este tutorial depende da System.Web
assemblagem. Adicione uma referência a esta assemblagem ao seu projeto:
- Em Explorador de Soluções, clique com o botão direito do rato em Referências e selecione Adicionar Referência...
- Selecione Assemblies > Framework e, em seguida, desloque-se para baixo e verifique System.Web
- Selecione OK
Adicionar algumas instruções de utilização necessárias
O código neste tutorial requer três instruções de utilização adicionais. Adicione estas instruções abaixo das instruções existentes using
na parte superior de Program.cs:
using System.Web;
using System.Net.Http;
Pedir uma consulta ao utilizador
Em Explorador de Soluções, abra Program.cs. Atualize o Main()
método:
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();
}
Este método:
- Pede uma consulta ao utilizador
- Chamadas
RunQueryAndDisplayResults(userQuery)
para executar a consulta e apresentar os resultados - Aguarda a entrada do utilizador para impedir que a janela da consola feche imediatamente.
Procurar resultados da consulta com a API de Pesquisa na Web do Bing
Em seguida, adicione um método que consulta a API e apresenta os resultados:
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);
}
}
Este método:
- Cria um
HttpClient
para consultar a API de Pesquisa na Web - Define o cabeçalho HTTP, que o
Ocp-Apim-Subscription-Key
Bing utiliza para autenticar o pedido - Executa o pedido e utiliza JSON.net para anular a serialização dos resultados
- Chamadas
DisplayAllRankedResults(responseObjects)
para apresentar todos os resultados por ordem classificada
Certifique-se de que define o valor de para a sua chave de Ocp-Apim-Subscription-Key
subscrição.
Apresentar resultados classificados
Antes de mostrar como apresentar os resultados por ordem classificada, veja uma resposta de pesquisa na Web de exemplo:
{
"_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"
}
}]
}
}
}
O rankingResponse
objeto JSON (documentação) descreve a ordem de apresentação adequada para os resultados da pesquisa. Inclui um ou mais dos seguintes grupos priorizados:
-
pole
: os resultados da pesquisa para obter o tratamento mais visível (por exemplo, apresentado acima da linha principal e da barra lateral). -
mainline
: os resultados da pesquisa a apresentar na linha principal. -
sidebar
: os resultados da pesquisa a apresentar na barra lateral. Se não existir uma barra lateral, apresente os resultados abaixo da linha principal.
A resposta de classificação JSON pode incluir um ou mais dos grupos.
Em Program.cs, adicione o seguinte método para apresentar resultados por ordem corretamente classificada:
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;
}
}
}
}
}
Este método:
- Ciclos sobre os
rankingResponse
grupos que a resposta contém - Apresenta os itens em cada grupo ao chamar
DisplaySpecificResults(...)
Em Program.cs, adicione os dois métodos seguintes:
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();
}
Estes métodos funcionam em conjunto para produzir os resultados da pesquisa para a consola.
Executar a aplicação
Execute a aplicação. O resultado deve ter um aspeto semelhante ao seguinte:
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...
...
Passos seguintes
Leia mais sobre como utilizar a classificação para apresentar resultados.