iphone ruby-on-rails ios ipad asihttprequest

iphone - Desarrollo de iOS: ¿Por qué siempre aparece el mensaje "Se produjo un error en la conexión" en el primer intento, pero el éxito en el siguiente?



ruby-on-rails ipad (4)

Estoy utilizando la biblioteca ASIHTTPRequest en mi aplicación iOS para realizar solicitudes RESTful a mi aplicación web Rails 3. Veo un error extraño y algo consistente la primera vez que intento realizar una solicitud POST a mi aplicación web, pero luego la solicitud POST funciona bien en el segundo intento. El error exacto es ...

Error Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred" UserInfo=0xb513740 {NSUnderlyingError=0xb5135a0 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1005.)", NSLocalizedDescription=A connection failure occurred}

Y aquí está mi código de solicitud ASIHTTP para realizar la solicitud POST ...

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://myrails3app.heroku.com/tournaments/%d/register.json", tid]]; __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; [request setRequestMethod:@"POST"]; [request addPostValue:username forKey:@"username"]; [request setCompletionBlock:^ { NSData *responseData = [request responseData]; NSLog(@"Success!"); }]; // Set the code to be called when the request fails [request setFailedBlock:^ { NSError *error = [request error]; NSLog(@"Error: %@", [error localizedDescription]); }]; // Start the request [request startAsynchronous];

¡Vale la pena mencionar que cuando se produce un error, se produce un error increíblemente rápido! Además, para lo que vale, mi aplicación Rail 3 a la que estoy haciendo la solicitud POST está alojada en Heroku. ¿Tus pensamientos?

Muchas gracias por tu sabiduría!


Conexión Segura Fallida

An error occurred during a connection to login.yahoo.com.

SSL recibió un registro con un código de autenticación de mensaje incorrecto.

(Código de error: ssl_error_bad_mac_read)

La página que está intentando ver no se puede mostrar porque no se pudo verificar la autenticidad de los datos recibidos. Por favor, póngase en contacto con los propietarios del sitio web para informarles de este problema. Alternativamente, use el comando que se encuentra en el menú de ayuda para reportar este sitio roto.


En iOS 5.1, incluso después de actualizar ASIHTTPRequest a ASIHTTPRequestVersion = @ "v1.8.1-61 2011-09-19" aún se necesita:

ASIHTTPRequest *req = [ASIHTTPRequest requestWithURL:url]; req.shouldAttemptPersistentConnection = NO;


Este problema me costó mucho entender por qué. El problema reside en ASIHTTPRequest (iOS), no en el código de los rieles.

Para resumir, el problema es específico del uso de la conexión persistente para cada solicitud enviada por ASIHTTPRequest.

Si bien esto es bueno para las solicitudes GET, la mayoría de la implementación del servidor no permite que la conexión persistente se use con la solicitud POST.

Realmente no tuve tiempo de investigarlo en profundidad en el lado del servidor, pero creo que el problema reside en el encabezado 100-Continue que debe enviarse (y que no) con una solicitud que tiene un cuerpo adjunto ( por lo tanto PUT / POST). Si desea tener una visión más profunda de lo que estoy hablando, lea la hoja de especificaciones: http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

Por lo tanto, la conexión persistente utilizada por ASIHTTPRequest espera a que se envíe una respuesta de 100, que nunca se envía. por lo que termina siendo el tiempo de espera.

Una solución es establecer persistentConnection en NO con sus solicitudes de publicación como las siguientes:

ASIHTTPRequest *req = [ASIHTTPRequest requestWithURL:url]; req.shouldAttemptPersistentConnection = NO;


También tuve que configurar la conexión setHeader Connection para "cerrarse" en el servlet de Java

response.setHeader("Connection", "close");