Membuat klien penelusuran aplikasi konsol di C#

Peringatan

Bing Search API berpindah dari Cognitive Services ke Bing Search Services. Mulai 30 Oktober 2020, instans baru Bing Search apa pun harus diprovisi dengan mengikuti proses yang didokumentasikan di sini. Bing Search API yang diprovisi menggunakan Cognitive Services akan didukung selama tiga tahun ke depan atau hingga akhir Perjanjian Enterprise Anda, mana pun yang terjadi terlebih dahulu. Untuk instruksi migrasi, lihat Bing Search Services.

Tutorial ini menunjukkan cara membuat aplikasi konsol .NET Core sederhana yang memungkinkan pengguna untuk mengkueri Bing Web Search API dan menampilkan hasil berperingkat.

Tutorial ini akan menunjukkan cara:

  • Membuat kueri sederhana ke Bing Web Search API
  • Menampilkan hasil kueri dalam urutan peringkat

Prasyarat

Untuk mengikuti tutorial ini, Anda perlu:

Membuat proyek Aplikasi Konsol

Di Visual Studio, buat proyek baru dengan Ctrl+Shift+N.

Dalam kotak dialog Proyek Baru, klik Visual C# > Windows Classic Desktop > Console App (.NET Framework) .

Beri nama aplikasi MyConsoleSearchApp, lalu klik OK.

Menambahkan paket JSON.net NuGet ke proyek

JSON.net memungkinkan Anda untuk menggunakan respons JSON yang dikembalikan oleh API. Tambahkan paket NuGet ke proyek Anda:

  • Di Penjelajah Solusi, klik kanan proyek, lalu pilih Kelola Paket NuGet... .
  • Pada tab Telusuri, , cari Newtonsoft.Json. Pilih versi terbaru, lalu klik Pasang.
  • Klik tombol OK pada jendela Tinjau Perubahan.
  • Tutup tab Visual Studio berjudul NuGet: MyConsoleSearchApp.

Menambahkan referensi ke System.Web

Tutorial ini bergantung pada perakitan System.Web. Tambahkan referensi ke perakitan ini ke proyek Anda:

  • Di Penjelajah Solusi, klik kanan Referensi dan pilih Tambahkan Referensi...
  • Pilih Perakitan > Kerangka Kerja, lalu gulir ke bawah dan periksa System.Web
  • Pilih OK

Tambahkan beberapa yang diperlukan menggunakan pernyataan

Kode dalam tutorial ini memerlukan tiga tambahan menggunakan pernyataan. Tambahkan pernyataan ini di bawah pernyataan using yang ada di bagian atas Program.cs:

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

Meminta kueri kepada pengguna

Di Penjelajah Solusi, buka Program.cs. Perbarui metode 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();
}

Metode ini:

  • Meminta kueri kepada pengguna
  • Memanggil RunQueryAndDisplayResults(userQuery) untuk menjalankan kueri dan menampilkan hasil
  • Menunggu masukan pengguna untuk mencegah jendela konsol segera ditutup.

Mencari hasil kueri menggunakan Bing Web Search API

Selanjutnya, tambahkan metode yang mengkueri API dan menampilkan hasilnya:

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

Metode ini:

  • Membuat HttpClient untuk mengkueri Web Search API
  • Mengatur header HTTP Ocp-Apim-Subscription-Key, yang digunakan Bing untuk mengautentikasi permintaan
  • Menjalankan permintaan dan menggunakan JSON.net untuk mendeserialisasi hasil
  • Memanggil DisplayAllRankedResults(responseObjects) untuk menampilkan semua hasil dalam urutan peringkat

Pastikan untuk menetapkan nilai Ocp-Apim-Subscription-Key pada kunci langganan Anda.

Menampilkan hasil berperingkat

Sebelum memperlihatkan cara menampilkan hasil dalam urutan peringkat, lihat contoh respons pencarian 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"
                }
            }]
        }
    }
}

Objek JSON rankingResponse (dokumentasi) menjelaskan urutan tampilan yang sesuai untuk hasil pencarian. Ini termasuk satu atau beberapa grup berikut yang diprioritaskan:

  • pole: Hasil pencarian yang harus diberikan perawatan yang paling terlihat (misalnya, ditampilkan di atas garis utama dan bilah samping).
  • mainline: Hasil pencarian untuk ditampilkan di garis utama.
  • sidebar: Hasil pencarian ditampilkan di bilah samping. Jika tidak ada bilah samping, tampilkan hasil di bawah garis utama.

Respons peringkat JSON dapat mencakup satu atau beberapa grup.

Di Program.cs, tambahkan metode berikut untuk menampilkan hasil dalam urutan peringkat yang tepat:

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

Metode ini:

  • Mengulangi grup rankingResponse yang ada dalam respons
  • Menampilkan item di setiap grup dengan memanggil DisplaySpecificResults(...)

Di Program.cs, tambahkan dua metode berikut:

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

Kedua metode ini digunakan bersamaan untuk menghasilkan hasil pencarian ke konsol.

Menjalankan aplikasi

Jalankan aplikasi. Output akan terlihat mirip dengan contoh berikut:

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

...

Langkah berikutnya

Baca selengkapnya tentang menggunakan peringkat untuk menampilkan hasil.