Membuat klien penelusuran aplikasi konsol di C#
Peringatan
Pada 30 Oktober 2020, API Bing Search dipindahkan dari layanan Azure AI ke layanan Bing Search. Dokumentasi ini disediakan hanya untuk referensi. Untuk dokumentasi terbaru, lihat dokumentasi Bing Search API. Untuk petunjuk tentang cara membuat sumber daya Azure baru untuk pencarian Bing, lihat Membuat sumber daya Pencarian Bing melalui Marketplace Azure.
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:
- Langganan Azure - Buat langganan gratis
- Setelah Anda memiliki langganan Azure, Bing Search di portal Azure untuk mendapatkan kunci dan titik akhir Anda. Setelah tersebar, klik Buka sumber daya.
- IDE Visual Studio.
Membuat proyek Aplikasi Konsol
Di Visual Studio, buat proyek baru dengan Ctrl
+Shift
+N
.
Dalam 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 Rakitan > Kerangka kerja, kemudian 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.