J'ai été aux prises avec un problème avec NSMutableURLRequest pour un article que j'écris sur l'écriture de cacao pour les clients des services web RESTful. Chaque fois que je utiliser le protocole HTTP PUT demandes, les paramètres du formulaire ne semble pas être passé à obtenir le serveur dans le corps de la requête. Si j'ai fait deux demandes, exactement les mêmes, en utilisant PUT et POST, les paramètres venu dans la requête POST, mais pas la requête PUT.
J'ai écrit un échantillon de Ruby on Rails serveur et Xcode projet pour démontrer le problème et l'a soumis que «mettre des paramètres ne sont pas transmises dans le corps lors de l'utilisation NSMutableURLRequest". Après avoir appris par Apple que ce n'était pas le cas, je re-testé, en pensant peut-être que 10.5.3 communiqué avait fixé. Eh non!
Eh bien, j'ai passé plusieurs années à travailler dans une entreprise de logiciels de grande correction des défauts signalés. donc je savais que le simple fait de soumettre à nouveau au même poste était peu probable pour donner un résultat différent. Les défauts sont généralement pas fermés à la légère, et certainement pas de façon arbitraire, donc je creusé wireshark et ne creusant un peu.
Il s'avère que les paramètres PUT are étant passé dans le corps. Ma description du problème n'était pas techniquement correct, même si le code que j'ai soumis a clairement montré un problème avec les requêtes PUT. J'ai pris les requêtes capturées pour un PUT et une requête POST et a remarqué une différence: les requêtes PUT avait aucun en-tête Content-Type. Ceci est clairement un bug, mais ce n'est pas le bug que j'ai décrit. Je vais présenter un nouveau défaut aujourd'hui, mais depuis j'ai trouvé une solution de contournement simple pour le problème, j'ai pensé le publier. La voici:
Lorsque vous utilisez NSMutableURLRequest de faire une requête PUT HTTP, ajoutez la ligne suivante de code (req est la NSMutableURLRequest):
[req setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];C'est tout ce qu'il ya à faire. Si vous ajoutez cette ligne de code, vos demandes PUT fonctionnera très bien.
Aucun commentaire:
Enregistrer un commentaire