Cómo conectarse a Mapas de Bing mediante Windows::Web::Http::HttpClient (aplicaciones de Windows en tiempo de ejecución con C++ y XAML)

Para conectarte a Mapas de Bing, usa la clase Windows::Web::Http::HttpClient del espacio de nombres Windows::Web::Http::HttpClient.

Requisitos previos

Los ejemplos siguientes usan C++ y se basan libremente en la muestra de HttpClient. Si necesitas ayuda general para crear una aplicación de Windows en tiempo de ejecución con C++, consulta Crear la primera aplicación de Windows en tiempo de ejecución con C++.

Para asegurarte de que la aplicación de Windows en tiempo de ejecución está lista para la red, debes establecer las capacidades de red necesarias en el archivo Package.appxmanifest del proyecto. Para obtener más información, consulta Cómo establecer las funcionalidades de red.

Crear una cuenta con la API de ubicación de Mapas de Bing y obtener una clave

Si aún no lo has hecho, primero necesitas obtener una clave que la aplicación usará para acceder al servicio. Sigue las instrucciones en Obtener una clave de Mapas de Bing.

Crear un proyecto

  1. Abre Microsoft Visual Studio 2013 y selecciona Nuevo proyecto en el menú Archivo.
  2. En la lista de plantillas, elige Visual C++.
  3. En la sección, elige Aplicaciones de la Tienda.
  4. En la sección, selecciona Aplicaciones universales, Aplicaciones de Windows o Aplicaciones de Windows Phone (en función de la plataforma de destino) y, a continuación, selecciona Aplicación vacía.
  5. Asigna el nombre BingMapsWithHttpClient a la aplicación y haz clic en Aceptar.

Establecer funcionalidades para habilitar el acceso a la red

Establece las funcionalidades de red de la aplicación para permitir el acceso a Internet. Para esta aplicación, tendrías que habilitar las funcionalidades de red porque el cliente se va a conectar a servicios web.

Se necesita la funcionalidad Internet (cliente), ya que la aplicación debe poder conectarse como un cliente a un servicio web en Internet.

Nota  En Windows Phone, solo hay una funcionalidad de red, Internet (cliente y servidor), que habilita todo el acceso a redes para la aplicación.

Si quieres obtener información más detallada acerca del acceso de red, consulta Cómo configurar las funcionalidades de aislamiento de red.

Estos pasos son necesarios para establecer las funcionalidades de red de una aplicación antes de que se implemente si accede a un servicio web en Internet.

  1. Usa Visual Studio 2013 para abrir el archivo package.appxmanifest.
  2. Selecciona la pestaña Funcionalidad.
  3. Para compilar la versión para Windows de la muestra, selecciona la funcionalidad Internet (cliente).

    Para compilar la versión para Windows Phone de la muestra, selecciona la funcionalidad Internet (cliente y servidor).

  4. Guarda y cierra el archivo de manifiesto.

Crear la interfaz de usuario

La interfaz de usuario consiste en dos controles TextBox que sirven para introducir valores de longitud y latitud, un TextBlock que muestra la información de ubicación devuelta por Bing y un botón para iniciar la operación. El código XAML siguiente deberá modificarse para una aplicación de la Tienda de Windows Phone.

Para una aplicación de la Tienda Windows, agrega el siguiente StackPanel de XAML a la cuadrícula de MainPage.xaml:


<StackPanel>
    <TextBlock x:Name="TitleText" HorizontalAlignment="Left" Margin="10,10,0,0" 
        TextWrapping="Wrap" Text="Connect to Bing Maps Web Service with the C++ REST SDK" 
        VerticalAlignment="Top" Height="52" Width="1356" FontSize="36"/>
    <StackPanel HorizontalAlignment="Left" Height="204" Margin="20,25,0,0" VerticalAlignment="Top" Width="922">
        <StackPanel Orientation="Horizontal">
            <TextBlock Padding="0,0,10,0" FontSize="14" Text="Enter a valid latitude:" Width="152"></TextBlock>
            <TextBox x:Name="Latitude" TextWrapping="Wrap" Text="47.640194" Height="28" Width="149"/>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <TextBlock Padding="0,0,10,0" FontSize="14" Text="Enter a valid longitude:"></TextBlock>
            <TextBox x:Name="Longitude"  TextWrapping="Wrap" Text="-122.129865" Height="28.519" 
                UseLayoutRounding="False" Width="149.021" d:LayoutRounding="Auto"/>
        </StackPanel>
        <Button x:Name="LocationButton" Content="Get Location" Height="50" Width="304" Click="Button_Click"/>
        <StackPanel Orientation="Horizontal" Margin="0,20,20,20">
            <TextBlock Padding="0,0,10,10" FontSize="14" Text="Bing Maps Response:"></TextBlock>
            <TextBlock x:Name="BingMapsResponse"  FontSize="14" HorizontalAlignment="Left" TextWrapping="Wrap"  
                VerticalAlignment="Top"  Width="744"/>
        </StackPanel>
    </StackPanel>
</StackPanel>


Agrega el controlador del botón para LocationButton. Una forma sencilla de hacer esto es eliminar el controlador existente y escribirlo de nuevo, y permitir que la etiqueta inteligente se encargue de la función en MainPage.xaml.h.

Conectar con la API de ubicación de Mapas de Bing y analizar los resultados

El trabajo real en esta muestra se realiza completamente en el método GetLocation. En este método, primero creamos un URI para enviar al servicio web que incluye los valores de entrada de longitud y latitud, y una cadena de consultas que especifica que queremos la respuesta con formato JSON y que proporciona la clave única. Luego creamos un nuevo objeto Windows::Web::Http::HttpClient, que representa una sesión HTTP. El método GetStringAsync comienza como una operación GET asincrónica. Cuando se completa esa operación, analizamos el texto JSON y escribimos los resultados en el TextBlock apropiado de nuestra interfaz de usuario.

Reemplaza todo el contenido de MainPage.xaml.h por este código:


//
// MainPage.xaml.h
// Declaration of the MainPage class.
//

#pragma once

#include "MainPage.g.h"

namespace BingMapsWithHttpClient
{
	/// <summary>
	/// An empty page that can be used on its own or navigated to within a Frame.
	/// </summary>
	public ref class MainPage sealed
	{
	public:
		MainPage();

    private:
        void Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
        void GetLocation(Platform::String^ strlong, Platform::String^ strlat);
    };
}


Reemplaza todo el contenido de MainPage.xaml.cpp por este código:


//
// MainPage.xaml.cpp
// Implementation of the MainPage class.
//

#include "pch.h"
#include "MainPage.xaml.h"
#include <sstream>
// <exception> and <string> are included indirectly via the default
// pch.h header file, which includes ppltasks.h

using namespace concurrency;
using namespace BingMapsWithHttpClient;

using namespace Platform;
using namespace Windows::Data::Json;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Navigation;
using namespace Windows::Web::Http;
using namespace std;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/p/?LinkID=234238

MainPage::MainPage()
{
    InitializeComponent();
}

void BingMapsWithHttpClient::MainPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    GetLocation(Longitude->Text, Latitude->Text);
}

void MainPage::GetLocation(String^ strlong, String^ strlat)
{
    wstring BingServiceKey = L"PASTE YOUR UNIQUE KEY HERE";
    wostringstream fragment;
    fragment << strlat->Data() << ',' << strlong->Data()
        << "?json&key=" << BingServiceKey;
    Uri^ uri = ref new Uri("http://dev.virtualearth.net/REST/v1/Locations/"
        + ref new String(fragment.str().c_str()));

    HttpClient^ httpClient = ref new HttpClient();
    auto op = httpClient->GetStringAsync(uri);
    create_task(op).then([this, strlong, strlat](String^ response)
    {
        wostringstream addressString;
        JsonValue^ val = JsonValue::Parse(response);

        // Display an error message if any of the json objects are not 
        // what we expect.
        try
        {
            auto resourceSets = val->GetObject()->GetNamedArray("resourceSets");
            auto estimatedTotal = resourceSets->GetAt(0)->GetObject()
                ->GetNamedNumber("estimatedTotal");

            if (estimatedTotal == 0)
            {
                return L"BingLocationService: request for " + strlat + ","
                    + strlong + " returned 0 resources";
            }

            auto resources = resourceSets->GetAt(0)->GetObject()->GetNamedArray("resources");
            addressString << "name:  "
                << resources->GetAt(0)->GetObject()->GetNamedString("name")->Data()
                << std::endl << "address:" << endl;

            for (auto& addressPart : resources->GetAt(0)->GetObject()->GetNamedObject("address"))
            {
                addressString << ("    ") << addressPart->Key->Data()
                    << ": " << addressPart->Value->GetString()->Data() << endl;
            }
        }

        catch (Platform::Exception^ e)
        {
            // To show the parse error to the end user
            // may or may not be the right thing to do. This
            // example shows how to capture the error. It is up 
            // to you to use the information appropriately.
            addressString << " Error " << e->Message->Data();
        }

        return ref new String(addressString.str().c_str());

    }).then([this](task<String^> response)
    {
        try
        {
            BingMapsResponse->Text = response.get();
        }

        catch (exception e)
        {
            //Platform::String needs a wchar_t[] for its constructor
            wostringstream wos;
            wos << e.what();
            BingMapsResponse->Text = ref new String(wos.str().c_str());
        }

        catch (Platform::Exception^ e)
        {
            BingMapsResponse->Text = e->Message;
        }
    });
}


La respuesta JSON sin procesar

El siguiente fragmento de código muestra la respuesta completa que vuelve del servicio web de Mapas de Bing como respuesta a nuestra solicitud HTTP.

{
   "authenticationResultCode": "ValidCredentials",
   "brandLogoUri": "http://dev.virtualearth.net/Branding/logo_powered_by.png",
   "copyright": "Copyright © 2013 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.",
   "resourceSets": [
      {
         "estimatedTotal": 1,
         "resources": [
            {
               "__type": "Location:http://schemas.microsoft.com/search/local/ws/rest/v1",
               "bbox": [
                  47.636272,
                  -122.13744,
                  47.643997,
                  -122.12216
               ],
               "name": "Microsoft Way, Redmond, WA 98052",
               "point": {
                  "type": "Point",
                  "coordinates": [
                     47.640137,
                     -122.12981
                  ]
               },
               "address": {
                  "addressLine": "Microsoft Way",
                  "adminDistrict": "WA",
                  "adminDistrict2": "King Co.",
                  "countryRegion": "United States",
                  "formattedAddress": "Microsoft Way, Redmond, WA 98052",
                  "locality": "Redmond",
                  "postalCode": "98052"
               },
               "confidence": "Medium",
               "entityType": "Address",
               "geocodePoints": [
                  {
                     "type": "Point",
                     "coordinates": [
                        47.640137,
                        -122.12981
                     ],
                     "calculationMethod": "Interpolation",
                     "usageTypes": [
                        "Display",
                        "Route"
                     ]
                  }
               ],
               "matchCodes": [
                  "Good"
               ]
            }
         ]
      }
   ],
   "statusCode": 200,
   "statusDescription": "OK",
   "traceId": "0a734b03d01b483b9e3b80216e831cac|BAYM000274|02.00.161.1800|BY2MSNVM000002, BY2MSNVM001076"
}


Temas relacionados

Otros recursos
Conexión a servicios web
Controlar excepciones en aplicaciones de red
Cómo configurar las funcionalidades de red
Cómo conectarse a un servidor HTTP mediante Windows.Web.Http.HttpClient
Cómo habilitar el bucle invertido y depurar el aislamiento de red
Referencia
Windows::Foundation::Uri
Windows::Web::Http
Windows::Web::Http.Filters
Windows::Web::Http.Headers
Muestras
Muestra de HttpClient

 

 

Mostrar:
© 2015 Microsoft