[Google+ Portable SDK .NET] Obtener Información del Perfil (IV)

Una vez completado el proceso OAuth 2.0 y obtenido el token de acceso, ya podemos acceder a los recursos públicos autentificados de la plataforma Google Plus, tales como datos de perfiles, amigos de los círculos (marcados como public), buscar amigos y recuperar las últimas publicaciones de nuestro muro (aquellas marcadas como “public”). En este artículo nos vamos a centrar en cómo obtener datos del perfil de un usuario Google plus haciendo una petición GET al recurso PEOPLE de Google Plus.

Antes de nada, vamos a recordar la hoja de ruta para esta serie de artículos

1. Crear aplicación Google +

2. Obtener código de autorización

3. Obtener Token de acceso

4. Obtener información del perfil (actual)

5. Amigos en los círculos

6. Buscar Amigos

7. Obtener las publicaciones del muro

Para obtener información del perfil hay que realizar una petición GET a la url

https://www.googleapis.com/plus/v1/people/<id_usuario>

donde <id_usuario> representa el id de la cuenta Google Plus o el literal “me” para hacer referencia a nuestra propia cuenta. A esta url hay que anexarle los siguientes parámetros de la query string.

access_token: es el token de acceso obtenido en la entrega anterior.

fields: este parámetro es opcional y permite establecer los campos a recuperar del perfil. Los posibles valores son:

aboutMe, ageRange,birthday,braggingRights,circledByCount,cover,currentLocation, displayName,etag,gender,id,image,isPlusUser,kind,language,name,nickname,objectType, organizations,placesLived,plusOneCount,relationshipStatus,tagline,url,urls,verified

Google Plus ofrece a través de su plataforma, una forma de probar todas sus peticiones, por ejemplo, en el siguiente enlace podemos probar la petición “Get” al recurso “People”.

En el siguiente fragmento de código podemos ver la implementación del método “ObtenerPerfilAsync” de la clase “smpGooglePlusApi

        public async Task<InfoPerfil> ObtenerPerfilAsync(string token,string idUsuario="me",string campos="")
        {
            InfoPerfil info = new InfoPerfil();
            if (string.IsNullOrEmpty(token))
                throw new ArgumentException("token");

            HttpClient cliente = new HttpClient();

            if (string.IsNullOrEmpty(idUsuario))
                idUsuario = "me";

            StringBuilder cadUrl = new StringBuilder();
            cadUrl.AppendFormat(Declaraciones.URL_PEOPLE_GET, idUsuario.UrlEncode());
            cadUrl.AppendFormat("?access_token={0}", token.UrlEncode());

            if (!string.IsNullOrEmpty(campos))
                cadUrl.AppendFormat("&fields={0}", campos.UrlEncode());

            HttpResponseMessage respuestaHttp = await cliente.SendAsync(new HttpRequestMessage(HttpMethod.Get, cadUrl.ToString())).ConfigureAwait(false);
            RespuestaGooglePlus respuestaGooglePlus = await UtilidadesGenerales.ProcesarRespuestaAsync(respuestaHttp);

            if (respuestaGooglePlus.Estado == EstadoGooglePlus.Correcto)
            {
                JObject resultado = JObject.Parse(respuestaGooglePlus.ContenidoRespuesta);
                info = ParsearPerfilUsuario(resultado);
            }
            return info;
        }

Si la petición ha sido correcta, el contenido de la respuesta es parseado a una instancia del tipo InfoPerfil.

namespace smpClienteGooglePlus.Entidades
{

    public class InfoPerfil
    {
        public string kind { get; set; }
        public string etag { get; set; }
        public string gender { get; set; }
        public List<Url> urls { get; set; }
        public string objectType { get; set; }
        public string id { get; set; }
        public string displayName { get; set; }
        public Name name { get; set; }
        public string url { get; set; }
        public Image image { get; set; }
        public bool isPlusUser { get; set; }
        public string language { get; set; }
        public bool verified { get; set; }
    }

    public class Name
    {

        public string formatted { get; set; }
        public string familyName { get; set; }
        public string givenName { get; set; }
        public string middleName { get; set; }
        public string honorificPrefix { get; set; }
        public string honorificSuffix { get; set; }
    }

    public class Image
    {
        public string url { get; set; }
        public string type { get; set; }
        public int height { get; set; }
        public int width { get; set; }
    }

    public class Url
    {
        public string value { get; set; }
        public string label { get; set; }
    }
}

usando para ello la función ParsearPerfilUsuario.


        public InfoPerfil ParsearPerfilUsuario(JObject item)
        {
            InfoPerfil perfil = new InfoPerfil();

            perfil.kind = (item["kind"] != null ? item["kind"].ToString() : string.Empty);
            perfil.etag = (item["etag"] != null ? item["etag"].ToString() : string.Empty);
            perfil.gender = (item["gender"] != null ? item["gender"].ToString() : string.Empty);
            if (item["urls"] != null)
            {
                perfil.urls = new List<Url>();
                foreach (JObject url_item in item["urls"])
                {
                    Url url = new Url();
                    url.label = (url_item["label"] != null ? url_item["label"].ToString() : string.Empty);
                    url.value = (url_item["value"] != null ? url_item["value"].ToString() : string.Empty);
                    perfil.urls.Add(url);
                }
            }
            perfil.objectType = (item["objectType"] != null ? item["objectType"].ToString() : string.Empty);
            perfil.id = (item["id"] != null ? item["id"].ToString() : string.Empty);
            perfil.displayName = (item["displayName"] != null ? item["displayName"].ToString() : string.Empty);
            if (item["name"] != null)
            {
                perfil.name = new Entidades.Name();
                perfil.name.formatted = (item["name"]["formatted"] != null ? item["name"]["formatted"].ToString() : string.Empty);
                perfil.name.familyName = (item["name"]["familyName"] != null ? item["name"]["familyName"].ToString() : string.Empty);
                perfil.name.givenName = (item["name"]["givenName"] != null ? item["name"]["givenName"].ToString() : string.Empty);
                perfil.name.honorificPrefix = (item["name"]["honorificPrefix"] != null ? item["name"]["honorificPrefix"].ToString() : string.Empty);
                perfil.name.honorificSuffix = (item["name"]["honorificSuffix"] != null ? item["name"]["honorificSuffix"].ToString() : string.Empty);
            }
            perfil.url = (item["url"] != null ? item["url"].ToString() : string.Empty);
            if (item["image"] != null)
            {
                perfil.image = new Entidades.Image();
                perfil.image.url = (item["image"]["url"] != null ? item["image"]["url"].ToString() : string.Empty);
            }
            bool tmpBool = false;
            if (item["isPlusUser"] != null)
            {
                if (bool.TryParse(item["isPlusUser"].ToString(), out tmpBool))
                {
                    perfil.isPlusUser = tmpBool;
                }
            }

            perfil.language = (item["language"] != null ? item["language"].ToString() : string.Empty);

            tmpBool = false;
            if (item["verified"] != null)
            {
                if (bool.TryParse(item["verified"].ToString(), out tmpBool))
                {
                    perfil.verified = tmpBool;
                }
            }

            return perfil;
        }

Nota: Por cuestiones de tiempo, en esta función no hemos tenido en cuenta todos los posibles campos del recurso People” de Google Plus.

En el siguiente enlace se puede conseguir más detalles sobre esta petición de información del perfil (GET PEOPLE).

En las anteriores entregas mostramos una imagen del proyecto de ejemplo para WPF y Windows Phone. En este caso vamos a mostrar una captura para WinRT.

googleplus_parte4_demoWinRt

En el siguiente enlace podéis descargar el código de ejemplo.