API request en Android

Li3cht

Muy buenas y felices fiestas MV-developers!

En estos días de fiesta he decidido tirar un poco por mi cuenta en lo referente a mi proyecto de grado superior y bueno, me gustaría preguntaros una cosa para poder "despegar".

Mi intención es hacer una app de Android que me permita hacer un seguimiento de mis series de televisión, lo que sería un tracker de toda la vida vaya (ya sé que hay muchos inventados).
Mi duda viene a la hora de realizar una petición a la API que he elegido; en clase aún no hemos tocado esto, así que antes de quedarme casi 1 mes sin hacer nada prefiero indagar por mi cuenta.

He leído en muchos web sites pero nada me lo termina de dejar claro (Hilo de stackoverflow); la API que me gustaría trabajar sobre ella es TheTVDB. He visto que ofrecen un tutorial pero me ha dejado algo "anonadado" ya que desconozco por completo de lo que hablan xD, si alguien me puede orientar se lo agradezco. Éste es: Tutorial.

Entiendo, también, que una vez hago la petición por nombre de la serie a esta API, ésta me devuelve un XML/JSON que podré leer y trabajar con él mediante un XML Parser. En caso afirmativo, ya sabré manejarme; sino, cómo debería hacerlo?

RPV: Necesito un poco de orientación para conseguir a raíz de una serie introducida en un editText, leer el XML que me devuelve una API y trabajar con esos datos.

cabron

Cuando pones una dirección web en un navegador, envías a una petición a un servidor diciéndole "quiero que me des tal cosa". El servidor busca esa cosa, y si la tiene te la devuelve. Obviamente de alguna forma se tienen que poner de acuerdo para comunicarse, que instrucciones acepta el servidor, como te devuelve la respuesta etc. Ese acuerdo es lo que se llama protocolo http.

Lo que tienes que hacer es exáctamente lo que viene en este enlace que has puesto http://www.androidsnippets.com/executing-a-http-post-request-with-httpclient

Creas la petición http, e indicas el destino (la url a donde vas a mandar la consulta), la envías, y como respuesta obtienes el contenido de lo que has solicitado, que en este caso sería un xml. Lo único es que no utilices HttPost como viene en el ejemplo, cámbialo por HttpGet. No es obligatorio, y te funcionaría también sin problemas si dejas Post, pero para lo que vas a hacer tiene más sentido usar get.

La diferencia es como se envían los datos al servidor, pero el resultado es el mismo, si tienes curiosidad por saber que cambia exactamente busca en google información sobre las peticiones get y post, y cuando se recomienda usar cada una.

1 respuesta
Li3cht

#2 Muchas gracias por la respuesta. Si te fijas el enlace que me has dado es el que menciono en #1, pero no termino de entender muy bien como funciona (estoy algo verde en Java de momento).

Entiendo que debería hacer el httpget a http://www.thetvdb.com/api/<apikey> y posteriormente anexarle a esta dirección la serie que me de el usuario en el editText.
Si esto está bien, lo que tengo en duda completamente es este trozo de código:

nameValuePairs.add(new BasicNameValuePair("id", "12345"));

Lo estoy interpretando como que él se inventa los datos, y a mi me quedaría más claro con un ejemplo de como piyar un dato de mi API.

1 respuesta
cabron

#3

El enlace lo he sacado de tu post, no era para darte información nueva si no para apuntarte que lo sigas paso a paso.

Sobre lo de nameValuePairs, es cuando quieres poner parámetros en la url. Por ejemplo en google, si quieres buscar "cosa", la url queda así:

http://www.google.com/search?q=cosa

Lo que va después de ? son los parámetros, en este caso la url sería http://www.google.com/search, y luego harías nameValuePairs.add(new BasicNameValuePair("q", "cosa" ) );

Solo tienes que usarlo cuando la url necesite parámetros, por ejemplo si quieres pedir Dexter, la url sería: http://www.thetvdb.com/api/GetSeries.php?seriesname=Dexter

Así que en la petición tendrías que poner http://www.thetvdb.com/api/GetSeries.php (sin el ?) como url, y añadir el parámetro seriesname=Dexter con nameValuePairs.add(new BasicNameValuePair("seriesname", "Dexter" ) );

Si la url que vas a solicitar no tiene parámetros (eso lo sabes por que no hay ningún ?, que es lo que indica el comienzo de la lista de parámetros), entonces con poner la url te vale.

1 respuesta
Li3cht

#4 Genial, me queda todo mucho más claro. Muchas gracias, cuando pruebe te digo algo :))!

12 días después
pdj

#1 Si necesitas algun ejemplo de peticiones GET / POST y parseo de JSON en java tengo varios (bastantes) ejemplos.

1 respuesta
Li3cht

#6 Por supuestísimo! Te estaría muy agradecido :qq:

1 respuesta
pdj

#7 Mini tutorial:
JERSEY es una implementación de javax, para usarlo en tu proyecto puedes añadir lo siguiente a tu pom:

 <dependencies>
        <!-- JERSEY -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.8</version>
        </dependency>
</dependencies>

GET:

spoiler

POST:

spoiler

WEBSERVICE:

GET

@GET
    @Path("/accounts") //Path a partir de tu webresource donde estara el servicio
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED) //Lo que espera recibir esto es una url estandar con parametros
    @Produces(MediaType.APPLICATION_JSON) //Lo que devuelve
    public Object getAccounts(@QueryParam("token") String token) {
        return AuxDummyServices.getAccounts(token);
    }

POST

@POST
    @Path("/createtransfer")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public Object createNewTransfer(@FormParam("token") String token, @FormParam("bankAccountOrigin") String bankAccountOrigin,
            @FormParam("bankAccountDestiny") String bankAccountDestiny, @FormParam("transferImport") Double transferImport) {
        return AuxDummyServices.createNewTransfer(token, bankAccountOrigin, bankAccountDestiny, transferImport);
    }

Y ahora un ejemplo de una clase:

@XmlRootElement
public class EBankingResponseOKBankCardServices extends EBankingResponseOK {


ArrayList<BankCardService> bankCardServicesList;

public EBankingResponseOKBankCardServices() {
    super();
    this.bankCardServicesList = new ArrayList<BankCardService>();
}

public EBankingResponseOKBankCardServices(ArrayList<BankCardService> bankCardServicesList) {
    super();
    this.bankCardServicesList = bankCardServicesList;
}

public ArrayList<BankCardService> getBankCardServicesList() {
    return bankCardServicesList;
}

public void setBankCardServicesList(ArrayList<BankCardService> bankCardServicesList) {
    this.bankCardServicesList = bankCardServicesList;
}
}

Con ponerle el XMLRootElement, todos los atributos salvo los marcados con un @Transient seran devueltos en el JSON o XML (dependiendo del produce del webservice), estas clases siempre tienen que tener un constructor default explicitamente declarado y los set / get de los atributos.

Si tienes alguna duda pregunta x aqui o pm.

Un saludo!

Usuarios habituales

  • pdj
  • Li3cht
  • cabron