User Tag List

Página 2 de 2 PrimerPrimer 12
Resultados 16 al 24 de 24

Tema: Enviar un HTTP POST a web service desde iOS

  1. #16

    Fecha de ingreso
    Jun 2004
    Ubicación
    Vivo en el pito foro...
    Mensajes
    20,686
    Mencionado
    70 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    230
    Agradecer Thanks Received 
    742
    Thanked in
    Agradecido 466 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    28
    Pues mirad qué casualidad, me hace falta aprender a hacer lo mismo pero desde Android. Una hayudita, compadres? Ya estoy con el goorgle de todas formas.

  2. #17

    Fecha de ingreso
    Jan 2010
    Ubicación
    Valencia
    Mensajes
    471
    Mencionado
    7 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    41
    Agradecer Thanks Received 
    19
    Thanked in
    Agradecido 9 veces en [ARG:2 UNDEFINED] posts
    Ya consigo encriptar en SHA1 (que no tenia ni idea de lo que era)

    El caso es que tengo que hacer una app de prueba para iOS, que entra a una web para leer datos.
    Primero hace login con user y pass. Si se loggea correctamente recibe {"success":true,"error":false,"msg":"OK","token":" xxxxxxxxxxxxxxxxxx"}

    luego con el token xxxxxxxxxxxxxxxxxx me devuelve una base de datos que tengo que mostrar en el iPhone.
    Esto:
    Array
    (
    [success] => 1 [error] => [results] => Array
    (
    [0] => Array
    (
    [number] => 31
    [sexo] => female
    [nombre] => Fidela
    [apellido] => Prieto
    [calle] => El Roqueo 74
    [ciudad] => Las Pedroñeras
    [provincia] => Cuenca
    [postal] => 16660
    [pais] => ES
    [email] => FidelaPrietoCasillas@spambob.com [telephonenumber] => 969 010 583
    [birthday] => 7/7/1979
    [kilograms] => 81.7
    [centimeters] => 174
    [guid] => d3eeedfb-bdd1-4088-b016-22d5b5d097eb [latitude] => 39.369350
    [longitude] => -2.765394
    [image] => http://www.appadia.com/prueba/nophoto0.png
    )

    el caso es que solo consigo hacer login, pero luego ya no se como pasarle el token por [POST] y el limit por [GET]
    y menos cuando reciba los datos, convertirlos para mostrar en tabla.

    Todo esto para hacer una prueba, a ver si me cogen :S
    va a estar muy complicado.....
    Caminos fáciles no llevan lejos

  3. #18

    Fecha de ingreso
    Feb 2004
    Ubicación
    Madrid
    Mensajes
    22,749
    Mencionado
    226 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2,240
    Agradecer Thanks Received 
    1,902
    Thanked in
    Agradecido 1,185 veces en [ARG:2 UNDEFINED] posts
    Cuando pasas algo por get, esto va en la URL directamente, sin embargo por post va en el body de la petición.

    Por tanto imaginate que la url es: http://www.laurl.com Usando tu propio código imaginemos que queremos pasar el parámetro limit=10 por get y el token que has dicho por post. Pues sería (te marco en negrita lo que añado a tu código):

    Código:
    // Enviamos usuario y password y leemos datos de la web
    NSString *postString;
    postString = [NSString stringWithFormat:@"token=%@", variableQueTieneElToken];
    
    // NSLog(postString);
    
    NSURL *url;
    url = [NSURL URLWithString:@"http://www.laurl.com?limit=10"]; <- Fíjate que en la URL va el parámetro directamente
    NSMutableURLRequest *req;
    req = [NSMutableURLRequest requestWithURL:url];
    NSString *msgLength;
    msgLength = [NSString stringWithFormat:@"%d", [postString length]];
    
    [req addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [req addValue:msgLength forHTTPHeaderField:@"Content-Type"];
    
    [req setHTTPMethod:@"POST"];
    [req setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
    
    
    conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
    if (conn) {
    webData = [NSMutableData data];
    }
    Los datos que has pegado... eso es un var_dump de un array de PHP o ese es el formato exacto con el que te viene?

    EDIT: No estoy segura al 100% de que tu código no tenga memory leaks o problemas de punteros... Así que yo de ti lo revisaría bien por si acaso que no se ahora mismo de memoria qué metodos te hacen retain automático y cuales no.

    -----Actualizado-----

    Cita Iniciado por pakoito Ver mensaje
    Pues mirad qué casualidad, me hace falta aprender a hacer lo mismo pero desde Android. Una hayudita, compadres? Ya estoy con el goorgle de todas formas.
    Qué necesitas hacer exactamente? Un request por post pasando el SHA1 de un password? Porque en Android con el HttpRequest no es nada difícil y supongo que si ya estás mirando en google habrás dado con ello

  4. #19

    Fecha de ingreso
    Jun 2004
    Ubicación
    Vivo en el pito foro...
    Mensajes
    20,686
    Mencionado
    70 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    230
    Agradecer Thanks Received 
    742
    Thanked in
    Agradecido 466 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    28
    Pues sip, sólo el detallito de hacerlo mejor en un AsyncTask y supongo que un Listener para la respuesta y como dios :P Preocupación--

    -----Actualizado-----

    Pues sip, sólo el detallito de hacerlo mejor en un AsyncTask y supongo que un Listener para la respuesta y como dios :P Preocupación--

  5. #20

    Fecha de ingreso
    Feb 2004
    Ubicación
    Madrid
    Mensajes
    22,749
    Mencionado
    226 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2,240
    Agradecer Thanks Received 
    1,902
    Thanked in
    Agradecido 1,185 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por pakoito Ver mensaje
    Pues sip, sólo el detallito de hacerlo mejor en un AsyncTask y supongo que un Listener para la respuesta y como dios :P Preocupación--

    -----Actualizado-----

    Pues sip, sólo el detallito de hacerlo mejor en un AsyncTask y supongo que un Listener para la respuesta y como dios :P Preocupación--
    No necesitas ningún listener. Si usas un AsyncTask lo que te devuelva el doInBackground se le pasa al onPostExecute. Ahí es donde puedes parsear la respuesta

    Un ejemplo de una request con un AsyncTask podría ser:

    Código:
    class RequestTask extends AsyncTask<String, String, String>{
    
        @Override
        protected String doInBackground(String... uri) {
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response;
            String responseString = null;
            try {
                response = httpclient.execute(new HttpGet(uri[0]));
                StatusLine statusLine = response.getStatusLine();
                if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    response.getEntity().writeTo(out);
                    out.close();
                    responseString = out.toString();
                } else{
                    response.getEntity().getContent().close();
                    throw new IOException(statusLine.getReasonPhrase());
                }
            } catch (ClientProtocolException e) {
                 //TODO Handle exception
            } catch (IOException e) {
                //TODO Handle exception
            }
            return responseString;
        }
    
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            //Aquí el código para parsear la respuesta, por ejemplo: 
            parseResponseString(result);
        }
    }
    Yo las AsyncTask a no ser que sea algo que se va a usar desde muchos sitios, las suelo poner como inner class del activity/clase que sea.

  6. #21

    Fecha de ingreso
    Jan 2010
    Ubicación
    Valencia
    Mensajes
    471
    Mencionado
    7 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    41
    Agradecer Thanks Received 
    19
    Thanked in
    Agradecido 9 veces en [ARG:2 UNDEFINED] posts
    Ya se que soy un pesado, pero ayudarme con esto porfavor....
    Tengo la función que convierte el password en formato sha1:

    Spoiler: Ver
    -(NSString *) sha1NSString *)input
    {
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:input.length];

    uint8_t digest[CC_SHA1_DIGEST_LENGTH];

    CC_SHA1(data.bytes, data.length, digest);

    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];

    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
    [output appendFormat:@"%02x", digest[i]];

    return output;
    }


    Luego la hago funcionar como he visto, pero no me funciona, me da un error:

    NSString *inputStr =@"the string to crypt";
    NSString *outputSHA1Str;
    outputSHA1Str= sha1(inputStr);

    Alguna idea?
    Gracias !!
    Caminos fáciles no llevan lejos

  7. #22

    Fecha de ingreso
    Feb 2004
    Ubicación
    Madrid
    Mensajes
    22,749
    Mencionado
    226 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2,240
    Agradecer Thanks Received 
    1,902
    Thanked in
    Agradecido 1,185 veces en [ARG:2 UNDEFINED] posts
    Si no pegas el error que te da... tampoco puedo decirte mucho xD

  8. #23

    Fecha de ingreso
    Jan 2010
    Ubicación
    Valencia
    Mensajes
    471
    Mencionado
    7 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    41
    Agradecer Thanks Received 
    19
    Thanked in
    Agradecido 9 veces en [ARG:2 UNDEFINED] posts
    Nombre:  error.png
Visitas: 41
Tamaño: 41.0 KB
    este es el error....

    --------------------------------------------------------

    Bueno, por fin lo he arreglado.

    He cambiado de método para codificar el password

    Spoiler: Ver
    NSString *hashkey = <dato a codificar>;
    // PHP uses ASCII encoding, not UTF
    const char *s = [hashkey cStringUsingEncoding:NSASCIIStringEncoding];
    NSData *keyData = [NSData dataWithBytes:s length:strlen(s)];

    // This is the destination
    uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0};
    // This one function does an unkeyed SHA1 hash of your hash data
    CC_SHA1(keyData.bytes, keyData.length, digest);

    // Now convert to NSData structure to make it usable again
    NSData *out = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
    // description converts to hex but puts <> around it and spaces every 4 bytes
    NSString *hash = [out description];
    hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
    hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
    hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
    // hash is now a string with just the 40char hash value in it


    el hash es el código en sha1
    Última edición por faraday; 12/10/2012 a las 12:29
    Caminos fáciles no llevan lejos

  9. #24

    Fecha de ingreso
    Feb 2004
    Ubicación
    Madrid
    Mensajes
    22,749
    Mencionado
    226 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2,240
    Agradecer Thanks Received 
    1,902
    Thanked in
    Agradecido 1,185 veces en [ARG:2 UNDEFINED] posts
    Es un poco "sucio" convertir a hexadecimal de esa manera la verdad porque el método description te da la "descripción" del objeto en hexadecimal. Esto suele ser normalmente la posición de memoria en la que se encuentra el objeto, y aunque en este caso concreto si te devuelve el contenido de NSData en hexadecimal, no aconsejan usarlo desde Apple dado que el método description podría cambiar también en un futuro ya que no está pensado para eso (sino para la descripción del objeto en sí).
    Por otro lado, si el NSData ya contiene una cadena en hexadecimal, el pasarlo a un string es trivial usando el método initWithData de NSString.
    Por último la mejor manera de hacerlo sería crearte una categoría de NSData como sugieren aquí.

Página 2 de 2 PrimerPrimer 12

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •