2012-06-07 14 views
7

Hemos intentado numerosas veces enviar solicitudes PUT de actualización a nuestro servidor Rails y seguimos recibiendo un 404 "La página que estaba buscando no existe"¿Pueden los dispositivos iOS enviar solicitudes PUT a aplicaciones de Rails?

Nuestro método de actualización es muy simple (raíles prácticamente genéricos).

def update 
@user = User.find(params[:id]) 

respond_to do |format| 
    if @user.update_attributes(params[:user]) 
    format.html { redirect_to @user, notice: 'User was successfully updated.' } 
    format.json { head :no_content } 
    else 
    format.html { render action: "edit" } 
    format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
end 

final

Cuando corro rizo de la línea de comandos para probar el método de actualización, que funciona bien. Pero, cuando pruebo los mismos métodos en objetivo-c, siempre resulta en un error 404.

Así que mi pregunta es: ¿pueden los dispositivos iOS enviar solicitudes PUT a servidores que usan NSURLConnection o no está implementado?

ACTUALIZACIÓN ::

Esto no actualiza la base de datos

NSString *dataString = @"user[first_name]=bob"; 
NSData *postBodyData = [NSData dataWithBytes: [dataString UTF8String] length:[dataString length]]; 
NSString *urlString = [NSString stringWithFormat:@"example.com/users/1.json"]; 
NSURL *fullURL = [NSURL URLWithString:urlString]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:fullURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20]; 
[request setHTTPMethod: @"PUT"]; 
[request setHTTPBody:postBodyData]; 
self.todoConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
receivedData = [NSMutableData data]; 

Esto actualiza la base de datos

NSString *urlString = [NSString stringWithFormat:@"example.com/users/1.json?user[first_name]=bob"]; 
NSURL *fullURL = [NSURL URLWithString:urlString]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:fullURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20]; 
[request setHTTPMethod: @"PUT"]; 
self.todoConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
receivedData = [NSMutableData data]; 
+0

Publicación de código Ruby cuando su pregunta es sobre soporte de iOS probablemente no le hará ningún bien. Si en su lugar publica su código Objective-C, podemos mirar y ver si está configurando correctamente el método HTTP (como se ilustra a continuación en David V). – glorifiedHacker

+0

Sí, lo siento. Estoy escribiendo el final de los rieles, y un desarrollador diferente estaba escribiendo el objetivo-c y no tenía acceso a su código. Está arriba ahora. –

+0

Me pregunto si tiene algo que ver con el hecho de que no se está escapando de los caracteres '[' y ']'. Intente configurar el cuerpo HTTP con los datos derivados de la cadena @ "usuario% 5Bfirst_name% 5D = brian". – glorifiedHacker

Respuesta

6

Usted puede hacer una NSMutableURLRequest y establecer el método HTTP :

- (void)setHTTPMethod:(NSString *)method 

Dale la secuencia @"PUT".

Así es como puede crear un NSURLConnection a partir de dicha solicitud.

NSMutableURLRequest *myMutableRequest[[NSMutableURLRequest alloc] initWithURL:myURL]; 
[myMutableRequest setHTTPMethod:@"PUT"]; 
[NSURLConnection connectionWithRequest:myMutableRequest delegate:myDelegate]; 
+1

Intenté eso, pero no funcionó. Las solicitudes POST y GET funcionan. –

+0

Quizás haya algún problema con su URL, parámetros o encabezados. ¿Depuró la solicitud para verificar que esté formateada correctamente? Puede intentar simplemente poner la cadena exacta que le proporcionó a cURL en su solicitud y ver si eso ayuda. –

+0

Hm, esto es interesante.Cuando intenté agregar datos del cuerpo a la solicitud PUT a través de [request setHTTPBody: @ "user [first_name] = brian"] respondería con una respuesta de 200, pero no actualizaría el registro de la base de datos. SIN EMBARGO, cuando añado los datos a la URL, cambia. Por ejemplo: test.com/users/1.json?user[first_name]=joe <- via PUT, ¡y funciona! –

4

Ajuste el HTTP tipo de método @ "POST"

y añadir un parámetro al cuerpo de la petición como: @ "PUT" para @ "_ método"

Se debe trabajar clave.

+0

¿podría ser tan amable y proporcionar un ejemplo completo de trabajo? – andi

7

En realidad @ akshay1188 tiene una solución viable, pero creo que el enfoque más elegante es agregar el tipo de contenido "application/x-www-form-urlencoded" a la solicitud:

[request setHTTPMethod:@"PUT"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
Cuestiones relacionadas