C 'de konsol uygulama arama istemcisi oluşturma

Uyarı

Bing Arama API'leri bilişsel hizmetlerden Bing Arama hizmetlere taşınıyor. 30 ekim 2020 ' den itibaren, buradabelgelenen işlem sonrasında Bing arama yeni örneklerin sağlanması gerekir. Bilişsel hizmetler kullanılarak sağlanan Bing Arama API'leri, sonraki üç yıl boyunca veya Kurumsal Anlaşma sonuna kadar, hangisi önce gerçekleşene kadar desteklenecektir. Geçiş yönergeleri için bkz. Bing arama Services.

Bu öğreticide, kullanıcıların Bing Web Araması API'si sorgulamasını ve derecelendirilen sonuçları görüntülemesini sağlayan basit bir .NET Core konsol uygulamasının nasıl oluşturulacağı gösterilmektedir.

Bu öğreticide nasıl yapılacağı gösterilmektedir:

  • Bing Web Araması API'si basit bir sorgu yapın
  • Sorgu sonuçlarını dereceli sırada görüntüle

Önkoşullar

Öğreticiyle birlikte izlemek için şunlar gerekir:

  • Azure aboneliği- ücretsiz olarak bir tane oluşturun
  • Azure aboneliğiniz olduktan sonra, anahtarınızı ve uç noktanızı almak için Azure Portal bir Bing Arama kaynağı oluşturun Bing arama bir kaynak oluşturun. Dağıtıldıktan sonra Kaynağa Git ' e tıklayın.
  • Visual STUDIO IDE.

Yeni bir konsol uygulaması projesi oluştur

Visual Studio’da Ctrl+Shift+N ile yeni bir proje oluşturun.

Yeni proje iletişim kutusunda, Visual C# > Windows Klasik Masaüstü > konsol uygulaması (.NET Framework) seçeneğine tıklayın.

Uygulamayı Myconsolesearchapp olarak adlandırın ve ardından Tamam' a tıklayın.

JSON.net NuGet paketini projeye ekleyin

JSON.net, API tarafından döndürülen JSON yanıtları ile çalışmanıza olanak sağlar. NuGet paketini projenize ekleyin:

  • Çözüm Gezgini projeye sağ tıklayıp NuGet Paketlerini Yönet... seçeneğini belirleyin.
  • Araştır sekmesinde için arama yapın Newtonsoft.Json . En son sürümü seçin ve ardından Install' a tıklayın.
  • Değişiklikleri gözden geçir penceresinde Tamam düğmesine tıklayın.
  • NuGet: MyConsoleSearchApp başlıklı Visual Studio sekmesini kapatın.

System. Web 'e başvuru ekleme

Bu öğretici derlemeyi temel alır System.Web . Projenize bu derlemeye bir başvuru ekleyin:

  • Çözüm Gezgini, Başvurular ' a sağ tıklayın ve Başvuru Ekle... öğesini seçin.
  • Derlemeler > Framework' ü seçin, ardından aşağı kaydırın ve System. Web ' i denetleyin
  • Tamam'ı seçin

Bazı gerekli using deyimlerini ekleyin

Bu öğreticideki kod, üç ek using deyimi gerektirir. Bu deyimleri, using program.cs'in en üstündeki mevcut deyimlerinin altına ekleyin:

using System.Web;
using System.Net.Http;

Kullanıcıdan bir sorgu isteyin

Çözüm Gezgini' de, program.cs' yi açın. Yöntemi güncelleştirin 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();
}

Bu yöntem:

  • Kullanıcıdan bir sorgu ister
  • RunQueryAndDisplayResults(userQuery)Sorguyu yürütmek ve sonuçları göstermek için çağrılar
  • Konsol penceresinin hemen kapatmasını engellemek için Kullanıcı girişi bekler.

Bing Web Araması API'si kullanarak sorgu sonuçları arayın

Sonra, API 'YI sorgulayan ve sonuçları görüntüleyen bir yöntem ekleyin:

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);
    }
}

Bu yöntem:

  • HttpClientWeb ARAMASı API 'sini sorgulamak için bir oluşturur
  • Ocp-Apim-Subscription-KeyBing 'in isteğin kimliğini doğrulamak için kullandığı http üstbilgisini ayarlar
  • İsteği yürütür ve sonuçların serisini kaldırmak için JSON.net kullanır
  • DisplayAllRankedResults(responseObjects)Tüm sonuçları derecelendirilmiş sırada görüntüleme çağrıları

Değerini abonelik anahtarınıza ayarladığınızdan emin olun Ocp-Apim-Subscription-Key .

Derecelendirilmiş sonuçları görüntüle

Sonuçları derecelendirildi sırada görüntülemeyi göstermeden önce, örnek bir Web araması yanıtına göz atın:

{
    "_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"
                }
            }]
        }
    }
}

rankingResponseJSON nesnesi (Belgeler) arama sonuçları için uygun görüntüleme sırasını açıklar. Aşağıdaki, önceliklendirilmiş gruplardan bir veya daha fazlasını içerir:

  • pole: En sık görünen işlemi almak için arama sonuçları (örneğin, ana hat ve kenar çubuğu üzerinde gösterilir).
  • mainline: Ana satırda görüntülenecek arama sonuçları.
  • sidebar: Kenar çubuğunda görüntülenecek arama sonuçları. Kenar çubuğu yoksa, sonuçları Mainline altında görüntüleyin.

Sıralama yanıtı JSON, bir veya daha fazla gruptan birini içerebilir.

Program.cs' de, sonuçları düzgün bir şekilde derecelendirilen sırada göstermek için aşağıdaki yöntemi ekleyin:

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;
                }
            }
        }
    }
}

Bu yöntem:

  • rankingResponseYanıtın içerdiği gruplar üzerinde döngüler
  • Her bir gruptaki öğeleri çağırarak görüntüler DisplaySpecificResults(...)

Program.cs içinde aşağıdaki iki yöntemi ekleyin:

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();
}

Bu yöntemler, arama sonuçlarının konsola çıktısını almak için birlikte çalışır.

Uygulamayı çalıştırma

Uygulamayı çalıştırın. Çıktı aşağıdakine benzer görünmelidir:

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...

...

Sonraki adımlar

Sonuçları göstermek için derecelendirmeyi kullanmahakkında daha fazla bilgi edinin.