Envoyer un JSON via POST dans NSURLRequest
J'ai un problème avec l'envoi d'un JSON à un Serveur avec l'API REST.
C'est le code que j'utilise:
NSString *jsonPostBody = [NSString stringWithFormat:@"'json' = '{\"user\":{\"username\":"
"\"%@\""
",\"password\":"
"\"%@\""
"}}'",
[username stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
[password stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSData *postData = [jsonPostBody dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *apiPathParams = [NSString stringWithFormat:@"%@",
@"getUser"
];
NSURL *url = [NSURL URLWithString:[[apiPath retain] stringByAppendingString:apiPathParams]];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:180.0];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:postData];
NSString* postDataLengthString = [[NSString alloc] initWithFormat:@"%d", [postData length]];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:postDataLengthString forHTTPHeaderField:@"Content-Length"];
[self internalRequest:request];
C'est ce que l'API ressemblerait, si c'était un formulaire html:
<form method="post" action="someAPI-URL">
<input name="json" value="{"user":...}" />
</form>
C'est ce que mon POST de Données ressemble quand je l'ajouter à la demande:
json={"user":{"username":"someUser","password":"somePassword"}}
Pour une raison que je ne connais pas le POST des Données n'arrivent pas sur le serveur.
Ai-je fait quelque chose de mal avec la mise en forme de la dataString?
Exactement comment dois-je formater mon dataString de sorte qu'il correspond à la Chaîne une forme comme ci-dessus, va fournir au serveur?
Toute aide serait très appréciée.
P. S. je préfère ne pas utiliser ASIHttpRequest, depuis que j'ai repris le projet de quelqu'un d'autre une toute autre requête fonctionne bien, sauf ce post de demande.
Modifier cela tout en vrac à une autre connexion de cadre serait très coûteuse en temps.
Ici est la internalRequest de la Méthode de code source
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:req delegate:self];
NSMutableDictionary *di = [NSMutableDictionary dictionaryWithObject:[[NSMutableData alloc] init] forKey:@"receivedData"];
[di setObject:[NSString stringWithFormat:@"%i",identifier] forKey:@"identifier"];
if (delegate == nil)
{
delegate = self;
}
[di setObject:delegate forKey:@"delegate"];
CFDictionaryAddValue(connectionToInfoMapping, connection, di)
source d'informationauteur Maverick1st
Vous devez vous connecter pour publier un commentaire.
puisque vous essayez d'envoyer un HTTP POST-tête comme
json={"user":{"username":"%@","password":"%@"}}
,cet exemple est pleinement qualifié pour finir dans la confusion.
C'est un mélange de
application/x-www-form-urlencoded
pour le corps entier etapplication/json
pour la valeur.Peut-être un moyen de résoudre ce problème:
Vous aurez probablement besoin de modifier l'en-tête HTTP:
due à un codage de l'JSON partie (valeur) du corps HTTP:
où
stringByAddingPercentEscapesUsingEncoding
est objective c jabberwocky pour le PHP équivalenturlencode
.HTH
Je pense que vous devez utiliser un JSON cadre et convertir
jsonPostBody
à la représentation JSON avant de l'envoyer. Vérifier ce accepté de répondre à , il montre comment créer la demande.Ne ce service web est un client web que vous pouvez utiliser votre navigateur et de test. Je vous conseille de vous que si ils ont un client web déjà essayer d'utiliser Mozilla Firefox avec le plugin firebug et de vérifier quelles sont les données et les en-têtes sont envoyés au serveur avec une demande il est également possible de voir la chaîne json dans le post de l'onglet données.
Après vous assurez-vous que ce genre de message, le serveur s'attendre, alors vous pouvez créer exactement le même message par vous-même, et l'envoyer.
Pour quelle raison vous essayez de créer votre propre json, je ne sais pas, mais je vous conseille l'utilisation d'un tiers de la bibliothèque comme JSON Cadre. Aussi je recommande que vous utilisez ASIHttpRequest bibliothèque pour les requêtes http. Il fait tout ce eaasy.
Mais la première chose est d'abord, vous devez être sûr que le type du message, quels sont les paramètres, les en-têtes, de type et les données...
Vous pouvez tester différents en-têtes et les paramètres de formulaire à l'aide de le Chrome Avancé Reste Client. Donc, avant de coder, vous pouvez savoir comment le service web fonctionne à l'aide de cet outil.