web-dev-qa-db-fra.com

Code d'état HTTP 411 - Longueur requise

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 :)

13
WantToKnow

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.

19
CouchDeveloper