entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

bad URL en AFNetworking operation

Guiandome por el codigo que ya tengo hecho para obtener datos de un JSON ahora lo que quiero es guardar los datos. Lo que estoy haciendo ahora es enviar una hora y un codigo para que se me guarden en la base de datos. la URL es la siguiente, teniendo una constante BaseURLString guardada en la misma clase.

-(void)reservar{

    NSString *weatherUrl = [NSString stringWithFormat:@"%@?method=setReservaHora&code=%@", BaseURLString, _recipeName];
    NSURL *url = [NSURL URLWithString:weatherUrl];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    // 2

    AFJSONRequestOperation *operation =
    [AFJSONRequestOperation JSONRequestOperationWithRequest:request
     // 3
                                                    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
                                                        NSLog(@"%@", JSON);
                                                        if ([JSON isEqual:[NSNull null]])
                                                            NSLog(@"JSON is NULL");
                                                            }

                                                    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
                                                        UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
                                                                                                     message:[NSString stringWithFormat:@"%@",error]
                                                                                                    delegate:nil
                                                                                           cancelButtonTitle:@"OK" otherButtonTitles:nil];
                                                        NSLog(@"%@",error);
                                                        [av show];
                                                    }];

    operation.JSONReadingOptions = NSJSONReadingAllowFragments;
    [operation start];

El error que me retorna es

Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x8e6aed0
{NSUnderlyingError=0x9d43450 "bad URL", NSLocalizedDescription=bad URL

Si le quito el ultimo parametro (&hora=%@ y el horaEnviar) me escribe en la base de datos pero me retorna un error

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be
completed. (Cocoa error 3840.)" (Invalid value around character 1.)
UserInfo=0x9b6c3a0 {NSDebugDescription=Invalid value around character
1.

He estado buscando todo el fin de semana pero no hay manera, no encuentro la solución, pruebo todo lo que encuentro y nada me sirve.

0voto

juancruzmdq comentado

Cual es la url que da problemas?
hace un log de weatherUrl y copialo aca.
Tene cuidado de no mostrar información sensitiva, como ip del servidos...

0voto

victor_capilla comentado

http://web.tk/testservice.php?method=setReservaHora&code=23091312&hora=23 del Septiembre de 2013 a las 12:00

Esto es lo que me muestra el LOG

2 Respuestas

1voto

Leonardo-Tadei Puntos227320

Hola Victor,

por lo que leo en los comentarios a raíz del debbuging que hiciste, tu problema está en el código PHP:

if($Request_Method=="setReservaHora")  {
    $code=$_REQUEST['code'];
    $hora=$_REQUEST['hora'];
    $query = "INSERT INTO table (id, code, hora, nombre, telefono, comentarios) VALUES (NULL, '$code', '$hora', '', '', '')";
    $result = mysql_query($query);
    while($row = mysql_fetch_assoc($result))    {
        $resultArray[] = $row;
    }
    echo json_encode($resultArray);
 }

El mensaje de error:

Warning: mysqlfetchassoc() expects parameter 1 to be resource, boolean
given in /home/u738720968/public_html/testservice.php on line 63 null

es porque un INSERT o un UPDATE o un DELETE no devuelven un subset de resultados, sino que devuelven truo o false indicando si la operación se hizo o no.

mysql_fetch_assoc() falla porque espera como parámetro un handler a un subset de resultados, pero recibe truo o false..

Lo que deberías hacer para devolver los datos en JSON, es una query con un SELECT luego de hacer el INSERT, y a ese resultado pasarlo a mysql_fetch_assoc().

Si lo que querés obtener son los datos del registro recién insertado, lo podés obtener con la función mysql_insert_id().

Saludos!

0voto

victor_capilla comentado

Muchas gracias, caso resuelto!

1voto

juancruzmdq Puntos1500

La url parece estar bien. estas seguro de que eso es lo que espera la API?

cuando armes la url proba de invocar este metodo, para evitar enviar algun caracter invalido

[@"http://web.tk/testservice.php?method=setReservaHora&code=23091312&hora=23" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

0voto

victor_capilla comentado

He puesto esto

 NSString *weatherUrl = [[NSString stringWithFormat:@"%@?method=setReservaHora&code=%@&hora=%@", BaseURLString, _recipeName, horaEnviar] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

Pero sigue con el mismo error.

La API, que es un php hecho por mi, hace lo siguiente

if($Request_Method=="setReservaHora")

 {
    $code=$_REQUEST['code'];
    $hora=$_REQUEST['hora'];

    $query = "INSERT INTO table (id, code, hora, nombre, telefono, comentarios) VALUES (NULL, '$code', '$hora', '', '', '')";

    $result = mysql_query($query);

    while($row = mysql_fetch_assoc($result))
    {
        $resultArray[] = $row;
    }

    echo json_encode($resultArray);
 }

Este mismo webservice lo uso en una app para Android y me funciona todo correctamente. La estoy portando a iOS desde 0. El método lo recoge al iniciar el webservice.

0voto

juancruzmdq comentado

Como es la URL que generas desde la app de Android? si con esa te anda, hay tenes un punto como para comparar que estas haciendo mal

0voto

juancruzmdq comentado

el campo "hora" en tu tabla de que tipo es? estas seguro que estas enviando bien los parametros?

0voto

juancruzmdq comentado

otra cosa, cuidado con la inyección de sql en tu código del servidor.

http://php.net/manual/en/security.database.sql-injection.php

0voto

victor_capilla comentado

Ok, Reviso todo esto y te digo algo. Porque me dices lo de la Inyección de código sql? Puede que sea inseguro lo que estoy haciendo?

0voto

juancruzmdq comentado

si, estas generando el string del select con los valores que recibís del usuario en $_REQUEST, sin hacer ningún tipo de control.

0voto

victor_capilla comentado

Ok, ya guarda datos pero sigue apareciendo el error de Invalid value around character 1. Podría ejecutar un request en el cual ignore la respuesta del webservice? es decir, no necesito obtener ningún JSON, podría ignorarlo de alguna manera?

0voto

juancruzmdq comentado

si, no hagas nada ni en el casa de succcess ni en el caso de failure y listo.
igual si la API te dise que algo estubo mal, es porque algo malo esta pasando

0voto

victor_capilla comentado

Ok, mira, si hago un poco de debug, cuando cargo en el objeto NSURLRequest:

NSString *weatherUrl = [[NSString stringWithFormat:@"%@?method=setReservaHora&code=%@&hora=%@", BaseURLString, _recipeName, horaEnviar] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:weatherUrl];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

esto es lo que tengo dentro de url:

Warning: mysql_fetch_assoc() expects parameter 1 to be resource,
boolean given in /home/u738720968/public_html/testservice.php on line
63 null

No se si sirve de algo...

0voto

juancruzmdq comentado

te fijaste que hay en la linea 63 de tu PHP?

supongo que debe ser la linea con la funcion mysql_fetch_assoc, no puede hacer el fetch porque la query fallo.
proba con este codigo.

error_reporting(E_ALL);

$result = mysql_query($query);
if($result === FALSE) {
    die(mysql_error());
}

0voto

juancruzmdq comentado

Te sirvió alguna de las respuestas? si lo pudiste resolver, que hiciste?

Saludos

0voto

victor_capilla comentado

Si, consegui solucionarlo con la respuesta de leonardo que hay abajo.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta