11

Ich versuche, Daten vom Server zu erhalten. Ich benutze NSURLConnectionDelegate, NSURLConnectionDataDelegate. Es gibt Code (Ziel - C).HTTP-Statuscode 411 - Länge erforderlich

-(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]; 
} 

Aber ich bekommen "411 - Länge erforderlich" wenn ich

[request setHTTPBodyStream:stream]; 

und "HASH (Someaddress)" wenn ich

[request setHTTPBody:reqData]; 

Ich versuchte

[request setHTTPBodyStream:stream]; 
NSString *postLength = [NSString stringWithFormat:@"%d", [reqData length]]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 

aber wieder "HASH (someAddress)"

Was habe ich falsch gemacht? Entschuldigung für mein Englisch. Danke :)

Antwort

17

Was habe ich falsch gemacht?

Nichts.

Der HTTP-Statuscode 411 (Länge erforderlich) wird vom Server als Antwort gesendet, wenn er aus welchen Gründen auch immer eine Nachricht ohne Inhaltslängenkopfzeile nicht akzeptiert.

Ein Server kann einen Inhalt ohne Inhalt-Länge-Header einfach akzeptieren oder nicht akzeptieren.

Wenn Sie für die Anforderung ein NSInputStream Objekt als Anfragetext über die Eigenschaft für die Anforderung festlegen, kann NSURLConnection die Länge des Körpers nicht mehr selbst auswerten. (Es gibt keine Eigenschaft length für einen Stream). Daher verwendet NSURLConnection einen bestimmten "Übertragungsmodus", nämlich "chunked transfer encoding". Dieser Übertragungsmodus sollte erfolgreich sein, um einen beliebigen Körper zu übermitteln, und es erfordert keinen Content-Legth-Header (eigentlich muss nicht enthalten). Leider akzeptiert der Server diese Art der Übertragung einfach nicht.

Siehe auch: (Wiki).

Um das Problem auf der Client-Seite zu lösen:

  • die Länge des Körpers selbst bestimmen (wenn möglich) und stellt für die Anforderung eines „Content-Length“ Header-Feld. Wenn dieser Eingabestrom aus einer Datei oder einem NSData Objekt erstellt wurde, kann die Länge einfach bestimmt werden. Stellen Sie jedoch sicher, dass Sie genau die gleiche Länge wie der tatsächliche Stream-Inhalt in Byte angeben.

  • Verwenden Sie keine NSInputStream, aber verwenden Sie ein NSData Objekt als Körper und legen Sie es über die Eigenschaft fest. Wenn Sie den Textkörper als NSData-Objekt festlegen, kann NSURLConnection die Inhaltslänge selbst bestimmen, und es fügt automatisch einen Content-Length-Header mit der richtigen Länge hinzu, sofern Sie ihn nicht selbst in der Anfrage festlegen.

Verwandte Themen