Inicio rápido: Envío de una consulta a Bing Local Business Search API en C#
Advertencia
El 30 de octubre de 2020, las API de Bing Search se trasladaron de los servicios de Azure AI a Bing Search Services. Esta documentación solo se proporciona como referencia. Para obtener documentación actualizada, consulte la documentación de Bing Search API. Para obtener instrucciones sobre cómo crear nuevos recursos de Azure para la búsqueda de Bing, consulte Creación de un recurso de Bing Search a través de Azure Marketplace.
Utiliza esta guía rápida para aprender a enviar solicitudes a Bing Local Business Search API, que es un servicio cognitivo de Azure. Aunque esta aplicación sencilla está escrita en C#, la API es un servicio web RESTful compatible con cualquier lenguaje de programación capaz de realizar solicitudes HTTP y analizar JSON.
Esta aplicación de ejemplo obtiene datos de respuesta local de la API para una consulta de búsqueda.
Prerrequisitos
- Una suscripción a Azure: cree una cuenta gratuita.
- Cualquier edición de Visual Studio 2019.
- Si usa Linux/MacOS, esta aplicación se puede ejecutar mediante Mono.
- Una vez que tenga la suscripción de Azure, crea un recurso de Bing Search en el portal de Azure para obtener la clave y el punto de conexión. Después de implementarla, haga clic en Ir al recurso.
Creación de la solicitud
El siguiente código crea un WebRequest
, establece el encabezado de clave de acceso y agrega una cadena de consulta para restaurante en Bellevue. A continuación, envía la solicitud y asigna la respuesta a una cadena para que contenga el texto JSON.
// Replace the accessKey string value with your valid access key.
const string accessKey = "enter key here";
const string uriBase = "https://api.cognitive.microsoft.com/bing/v7.0/localbusinesses/search";
const string searchTerm = "restaurant in Bellevue";
// Construct the URI of the search request
var uriQuery = uriBase + "?q=" + Uri.EscapeDataString(searchQuery) + mkt=en-us;
// Run the Web request and get response.
WebRequest request = HttpWebRequest.Create(uriQuery);
request.Headers["Ocp-Apim-Subscription-Key"] = accessKey;
HttpWebResponse response = (HttpWebResponse)request.GetResponseAsync().Result;
string json = new StreamReader(response.GetResponseStream()).ReadToEnd();
Ejecución de la aplicación completa
En el código siguiente se usa Bing Local Business Search API para devolver los resultados de búsqueda localizados del motor de búsqueda de Bing. Puede usar este código siguiendo estos pasos:
- Cree una nueva solución de consola en Visual Studio (community Edition es suficiente).
- Reemplace Program.cs por el código que se proporciona a continuación.
- Reemplace el valor de
accessKey
por una clave de acceso válida para la suscripción. - Ejecute el programa.
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
namespace localSearch
{
class Program
{
// **********************************************
// *** Update or verify the following values. ***
// **********************************************
// Replace the accessKey string value with your valid access key.
const string accessKey = "enter key here";
const string uriBase = "https://api.cognitive.microsoft.com/bing/v7.0/localbusinesses/search";
const string searchTerm = "restaurant in Bellevue";
// Returns search results including relevant headers
struct SearchResult
{
public String jsonResult;
public Dictionary<String, String> relevantHeaders;
}
static void Main()
{
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.WriteLine("Searching locally for: " + searchTerm);
SearchResult result = BingLocalSearch(searchTerm, accessKey);
Console.WriteLine("\nRelevant HTTP Headers:\n");
foreach (var header in result.relevantHeaders)
Console.WriteLine(header.Key + ": " + header.Value);
Console.WriteLine("\nJSON Response:\n");
Console.WriteLine(JsonPrettyPrint(result.jsonResult));
Console.Write("\nPress Enter to exit ");
Console.ReadLine();
}
/// <summary>
/// Performs a Bing Local business search and return the results as a SearchResult.
/// </summary>
static SearchResult BingLocalSearch(string searchQuery, string key)
{
// Construct the URI of the search request
var uriQuery = uriBase + "?q=" + Uri.EscapeDataString(searchQuery) + "&mkt=en-us";
// Perform the Web request and get the response
WebRequest request = HttpWebRequest.Create(uriQuery);
request.Headers["Ocp-Apim-Subscription-Key"] = key;
HttpWebResponse response = (HttpWebResponse)request.GetResponseAsync().Result;
string json = new StreamReader(response.GetResponseStream()).ReadToEnd();
// Create result object for return
var searchResult = new SearchResult();
searchResult.jsonResult = json;
searchResult.relevantHeaders = new Dictionary<String, String>();
// Extract Bing HTTP headers
foreach (String header in response.Headers)
{
if (header.StartsWith("BingAPIs-") || header.StartsWith("X-MSEdge-"))
searchResult.relevantHeaders[header] = response.Headers[header];
}
return searchResult;
}
/// <summary>
/// Formats the given JSON string by adding line breaks and indents.
/// </summary>
/// <param name="json">The raw JSON string to format.</param>
/// <returns>The formatted JSON string.</returns>
static string JsonPrettyPrint(string json)
{
if (string.IsNullOrEmpty(json))
return string.Empty;
json = json.Replace(Environment.NewLine, "").Replace("\t", "");
StringBuilder sb = new StringBuilder();
bool quote = false;
bool ignore = false;
int offset = 0;
int indentLength = 3;
foreach (char ch in json)
{
switch (ch)
{
case '"':
if (!ignore) quote = !quote;
break;
case '\'':
if (quote) ignore = !ignore;
break;
}
if (quote)
sb.Append(ch);
else
{
switch (ch)
{
case '{':
case '[':
sb.Append(ch);
sb.Append(Environment.NewLine);
sb.Append(new string(' ', ++offset * indentLength));
break;
case '}':
case ']':
sb.Append(Environment.NewLine);
sb.Append(new string(' ', --offset * indentLength));
sb.Append(ch);
break;
case ',':
sb.Append(ch);
sb.Append(Environment.NewLine);
sb.Append(new string(' ', offset * indentLength));
break;
case ':':
sb.Append(ch);
sb.Append(' ');
break;
default:
if (ch != ' ') sb.Append(ch);
break;
}
}
}
return sb.ToString().Trim();
}
}
}