ajax de tipo PUT o POST en UIWebView no pasa el cuerpo HTTP

Estoy abriendo un documento HTML simple dentro de UIWebView en mi aplicación:

<h3>Testing Put</h3> <form id="testPut" action="onPut"> <div> <p><input type="text" id="putValue" name="putValue" value="some value string goes here" size="100"/></p> <p><input type="submit" value="Submit via PUT"/></p> </div> </form> <script> $('#testPut').submit(function(ev) { ev.preventDefault(); var value = $('#putValue').val(); $.ajax({ type: "PUT", url: "data/info/put", contentType: "text/plain; charset=utf-8", data: encodeURIComponent(value), dataType: "text" }); }); </script> 

En aras de la simplicidad, omití los manejadores de errores y errores del código ya que mi problema no está relacionado con responder realmente a la request.

Estoy usando jQuery 1.10.2 pero obtengo exactamente los mismos resultados cuando uso el object XMLHttpRequest puro.

Como esto es un problema conocido, las requestes de Ajax no pueden ser captadas por los methods UIWebViewDelegate , decidí crear un descendiente bastante simple de NSURLProtocol y registrarlo en el método -viewDidLoad mi controller:

 @implementation MyProtocol + (BOOL)canInitWithRequest:(NSURLRequest *)request { // only "data/info" requests are welcome NSRange range = [[request.URL absoluteString] rangeOfString:@"data/info"]; return NSNotFound != range.location; } + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { return request; } - (void)startLoading { NSURLRequest *request = self.request; NSLog(@"%@", request); NSLog(@"Headers: %@", [request allHTTPHeaderFields]); NSLog(@"Method: %@", [request HTTPMethod]); NSLog(@"Body: %@", [request HTTPBody]); } - (void)stopLoading {} @end 

Luego ejecuto la aplicación, presiono el button "Enviar a través de PUT" y observo lo siguiente en el logging de la console de Xcode:

 2013-10-31 16:38:28.077 TestHTTPPUTiOS[1608:4a03] <NSURLRequest: 0x8942c20> { URL: file:///Users/oradyvanyuk/Library/Application%20Support/iPhone%20Simulator/7.0.3/Applications/90232D0E-3243-4517-A2B7-15A17371E117/TestHTTPPUTiOS.app/data/info/put } 2013-10-31 16:38:28.079 TestHTTPPUTiOS[1608:4a03] Headers: { Accept = "text/plain, */*; q=0.01"; "Content-Type" = "text/plain; charset=utf-8"; Origin = "file://"; "X-Requested-With" = XMLHttpRequest; } 2013-10-31 16:38:28.079 TestHTTPPUTiOS[1608:4a03] Method: PUT 2013-10-31 16:38:28.080 TestHTTPPUTiOS[1608:4a03] Body: (null) 

Como puede ver, el cuerpo de la request HTTP está vacío. He intentado usar el método POST y obtuve exactamente el mismo resultado, con la única diferencia de Method: POST en la console.

Cuando uso el método GET, también obtengo un cuerpo HTTP vacío, pero esto es de hecho esperado ya que la cadena putValue del formulario llega a la URL de la request HTTP.

¿Podría por favor asesorar sobre este tema o al less decirme si estoy haciendo algo mal? Necesito get el valor pasado como contenido del cuerpo de HTTP y no en la URL, ya que puede ser bastante largo.

¿Puedes probar lo siguiente para tu llamada AJAX?

 $.ajax({ type: "POST", url: "data/info/put", data: 'key='+encodeURIComponent(value), dataType: "text" }); 

Probé varias configuraciones y combinaciones con su ejemplo específico, y este fue el único que envió los datos de manera confiable como se esperaba (es decir, eliminando la especificación de tipo de contenido y cambiando el tipo de request a POST de PUT). Además, tenga en count que PUT no es compatible con todos los browseres, así que a less que haya alguna razón crítica para usarlo en lugar de POST, probablemente no debería hacerlo.