Peut les appareils iOS envoyer des demandes PUT Rails apps?
Nous avons essayé de nombreuses fois de l'envoi de mise à jour de demandes pour notre serveur Rails et nous continuons à recevoir une erreur 404 La page que vous recherchez n'existe pas"
Notre méthode de mise à jour est très simple (pratiquement générique rails).
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
fin
Quand je lance CURL à partir de la ligne de commande pour tester la méthode de mise à jour, il fonctionne très bien. Mais, quand j'ai essayé les mêmes méthodes en objective-c, il en résulte toujours une erreur 404.
Donc ma question est: peut-appareils iOS envoyer METTRE les requêtes vers les serveurs en utilisant NSURLConnection ou n'est-ce pas mises en œuvre?
Mise à JOUR::
Ce n'est pas de mise à jour de la base de données
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];
Cela met à jour la base de données
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];
Ouais, désolé à ce sujet. Je suis en train d'écrire les rails fin, et un autre développeur a été écrit à l'objective-c et je n'ai pas accès à son code. Il est maintenant.
Je me demande si elle a quelque chose à voir avec le fait que vous ne pouvez pas échapper à la '[' et ']' personnages. Essayez de définir le corps HTTP avec des données tirées de la chaîne @"l'utilisateur%5Bfirst_name%5D=brian".
J'ai perdu presque une journée essayant de se faire.
Cela ressemble à un trou de sécurité. Comment feriez-vous pour authentifier la requête PUT?
OriginalL'auteur Brian Weinreich | 2012-06-07
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire un NSMutableURLRequest et de définir la méthode HTTP:
Donner de la chaîne
@"PUT"
.Ici est de savoir comment vous pouvez créer une NSURLConnection d'une telle demande.
Peut-être que quelque chose est incorrect avec votre URL, les paramètres ou les en-têtes. Avez-vous de débogage de la demande pour vérifier qu'il est correctement formaté? Vous pouvez essayer juste de mettre dans la chaîne de caractères exacte de votre condition de roulage dans votre demande et voir si cela aide.
Hm, c'est intéressant. Quand j'ai essayé d'ajouter les données du corps à la demande via [demande setHTTPBody:@"utilisateur[prenom]=brian"] il serait répond avec une réponse 200, mais il ne serait pas de mise à jour de la base de données d'enregistrement. CEPENDANT, quand j'ai ajouter les données à l'URL, ça change. Par exemple: test.com/users/1.json?user[prenom]=joe <-- via le METTRE, et ça marche!
OriginalL'auteur David V
En fait @akshay1188 a une solution viable, mais je pense que la solution la plus élégante approche consiste à ajouter le "application/x-www-form-urlencoded" type de contenu à la demande:
OriginalL'auteur MoFlo
Définir la méthode HTTP de type @"POST"
Et ajouter un paramètre pour le corps de la requête:
@"METTRE" pour clé @"_method"
Il devrait fonctionner.
OriginalL'auteur akshay1188