J'essaie d'obtenir des données du serveur. J'utilise NSURLConnectionDelegate, NSURLConnectionDataDelegate. Il y a du code (Objectif - C).
-(void)sendRequest
{
NSURL* url = [[NSURL alloc] initWithString:@"http://SomeServer"];
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] init];
NSString* reqBody = [NSString stringWithFormat:@"<tag>Content</tag>"];
NSData* reqData = [reqBody dataUsingEncoding:NSUTF8StringEncoding];
NSInputStream* stream = [NSInputStream inputStreamWithData:reqData];
[request setURL:url];
[request setHTTPBodyStream:stream];
[request setHTTPMethod:@"POST"];
self.wpData = [[NSMutableData alloc] init];
NSURLConnection* conection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[conection start];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[self.wpData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d {
NSString* str = [[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding];
NSLog(@"RESPONSE DATA: %@",str);
[self.wpData appendData:d];
}
Mais j'obtiens "411 - Longueur requise" lorsque j'utilise
[request setHTTPBodyStream:stream];
et "HASH (someAddress)" lorsque j'utilise
[request setHTTPBody:reqData];
J'ai essayé
[request setHTTPBodyStream:stream];
NSString *postLength = [NSString stringWithFormat:@"%d", [reqData length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
mais encore "HASH (someAdddress)"
Qu'est ce que j'ai mal fait? Désolé pour mon anglais. Merci :)
Qu'est ce que j'ai mal fait?
Rien.
Le code d'état HTTP 411 (longueur requise) est envoyé par le serveur en réponse lorsqu'il refuse d'accepter un message sans en-tête de longueur de contenu, quelle qu'en soit la raison.
Un serveur peut simplement ou non accepter un contenu sans en-tête Content-Length.
Lorsque vous définissez un objet NSInputStream
comme corps de demande via la propriété HTTPBodyStream
pour la demande, NSURLConnection
ne peut plus évaluer la longueur du corps lui-même. (il n'y a pas de propriété length
pour un flux). Par conséquent, NSURLConnection
utilise un certain "mode de transfert", à savoir un "codage de transfert par blocs". Ce mode de transfert devrait réussir à transmettre n'importe quel corps et il ne nécessite pas d'en-tête Content-Legth (en fait doit n'en contient pas). Hélas, le serveur n'accepte tout simplement pas ce type de transfert.
Voir aussi: codage de transfert en morceaux (wiki).
Pour résoudre le problème côté client:
Déterminez vous-même la longueur du corps (si possible) et définissez un champ d'en-tête "Content-Length" pour la demande. Si ce flux d'entrée a été créé à partir d'un fichier ou d'un objet NSData
, la longueur peut être facilement déterminée. Mais assurez-vous de définir la même longueur exacte que le contenu du flux réel en octets.
N'utilisez pas un NSInputStream
, mais utilisez un objet NSData
comme corps et définissez-le via la propriété HTTPBody
. Lorsque vous définissez le corps en tant qu'objet NSData
, NSURLConnection
peut déterminer la longueur du contenu lui-même, et il ajoutera automatiquement un en-tête Content-Length avec la longueur correcte, sauf si vous le définissez vous-même dans le demande.