Partilhar via


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:

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.