31

Sto scrivendo un'applicazione che si connette a un server utilizzando NSURLConnection.Come posso ottenere il corpo di NSURLResponse?

Nel metodo delegato didreceiveresponse, se il codice di stato è 404, annullo la connessione e desidero visualizzare un messaggio con un errore personalizzato che viene generato nel server.

Il problema è che dall'oggetto risposta, posso solo ottenere statuscodi, intestazioni, mimetype, ecc. Ma senza corpo.

Come ottengo il messaggio corpo da NSURLResponse?

risposta

26

Perché si annulla la connessione? Dopo tutto, 404 può avere anche il corpo del contenuto. Basta non cancellarlo e lasciare che il programma chiami il prossimo metodo delegato NSURLConnection. Quando viene chiamato il dato [il corpo del contenuto] - (void)connection:(NSURLConnection *) didReceiveData:(NSData *), è necessario recuperare i dati lì. Read corresponding part in the docs:

La risposta da un server a una richiesta può essere visualizzata in due parti: metadati che descrivono il contenuto e i dati del contenuto dell'URL. I metadati comuni alla maggior parte dei protocolli sono incapsulati dalla classe NSURLResponse e sono costituiti dal tipo MIME, dalla lunghezza prevista del contenuto, dalla codifica del testo (ove applicabile) e dall'URL che ha fornito la risposta.

Le classi NSURLConnection e NSURLDownload forniscono l'interfaccia per stabilire una connessione specificata da un oggetto NSURLRequest e scaricare il contenuto. Un oggetto NSURLConnection fornisce dati al delegato non appena viene ricevuto dall'origine di origine, mentre un oggetto NSURLDownload scrive i dati della richiesta direttamente sul disco. Entrambe le classi forniscono un ampio supporto delegato per rispondere a reindirizzamenti, sfide di autenticazione e condizioni di errore.

Per quanto riguarda un esempio di implementazione delegato:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)theData{ 
    NSLog(@"String sent from server %@",[[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding]); 

} 
+2

Se stai facendo una chiamata sincrona, però, non si sta utilizzando metodi delegato. Ottieni subito il risultato: [NSURLConnection sendSynchronousRequest: request returningResponse: & response error: & err] – Oscar