11

cerco di ottenere i dati dal server. Uso NSURLConnectionDelegate, NSURLConnectionDataDelegate. C'è il codice (Objective - C).Codice di stato HTTP 411 - lunghezza desiderata

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

Ma ottengo "411 - lunghezza desiderata" quando uso

[request setHTTPBodyStream:stream]; 

e "cancelletto (someAddress)" quando uso

[request setHTTPBody:reqData]; 

ho cercato

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

ma di nuovo "HASH (someAdddress)"

Cosa ho fatto di sbagliato? Ci scusiamo per il mio inglese. Grazie :)

risposta

17

Cosa ho fatto di sbagliato?

Niente.

Il codice di stato HTTP 411 (Length Required) viene inviato dal server come risposta quando si rifiuta di accettare un messaggio senza un'intestazione di lunghezza del contenuto, per qualsiasi motivo.

Un server può semplicemente o non può accettare un contenuto senza un'intestazione Content-Length.

Quando si imposta un oggetto NSInputStream come corpo della richiesta tramite la proprietà HTTPBodyStream per la richiesta, NSURLConnection non può più valutare la lunghezza del corpo stesso. (non esiste una proprietà length per un flusso). Quindi, NSURLConnection utilizza una determinata "modalità di trasferimento", ovvero "codifica di trasferimento chunked". Questa modalità di trasferimento deve riuscire a trasmettere qualsiasi corpo e non richiede un'intestazione Content-Legth (in realtà non deve contenere uno solo). Purtroppo, il server semplicemente non accetta questo tipo di trasferimento.

Vedere anche: Chunked transfer encoding (wiki).

Per risolvere il problema sul lato client:

  • Determinare la lunghezza del corpo da soli (se possibile) e impostare un "Content-Length" campo di intestazione per la richiesta. Se questo flusso di input è stato creato da un file o da un oggetto NSData, la lunghezza può essere facilmente determinata. Ma assicurati di impostare la stessa lunghezza del contenuto del flusso reale in byte.

  • Non utilizzare NSInputStream, ma utilizzare un oggetto NSData come corpo e impostarlo tramite la proprietà HTTPBody. Quando si imposta il corpo come un oggetto NSData, NSURLConnection può determinare la lunghezza contenuto stesso, che verrà automaticamente aggiungere un'intestazione Content-Length con la lunghezza corretta, a meno che non si imposta da soli nella richiesta.

Problemi correlati