Como faço para detectar uma resposta HTTP, analisar o XML e salvar em um NSString?
-
12-09-2019 - |
Pergunta
Eu venho tentando descobrir isso por semanas e eu ainda não recebem nada. Eu estou usando o ASIHTTPRequest e ive enviada com sucesso os dados para um servidor e agora eu preciso para obter o XML de resposta, analisá-lo e salvar os elementos para cada NSString rotulados para que eu possa publicá-la para o servidor. Alguém tem uma idéia de como fazer isso?
Solução
De olhar para o Como página Use , eu acho que você quer fazer é implementar métodos que podem ser chamados quando o pedido está completo. Por exemplo, digamos que você tem um done:
método que você quer ser chamado quando seus concluída pedido. Você pode definir esse método como o seu selector "acabado" no pedido:
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease];
[request setDelegate:self];
[request setDidFinishSelector:@selector(done:)];
Então, mais tarde, você implementar o método done:
:
- (void)done:(ASIHTTPRequest *)request
{
NSString *response = [request responseString];
}
Isso tudo é supondo que você está enviando os pedidos de forma assíncrona; se você estiver usando chamadas síncronas, você pode simplesmente usar a propriedade responseString
sobre o pedido.
Outras dicas
Obter uma cópia de uma biblioteca XML para o iPhone se você tiver outra do que as necessidades de análise de XML triviais.
Eu usei GDataXMLNode do Google para isso antes, mas eu provavelmente usaria KissXML para o trabalho futuro, porque é mais perto NSXML (a biblioteca da Apple, que não é fornecido para o iphone infelizmente).
Aqui está uma maneira de analisar a resposta, aqui eu estou procurando erros que você pode normalmente ver a partir de um servidor Rails, ao longo das linhas de:
<errors><error>Description of what went wrong</error></errors>
Você pode ver que eu recebo o 'pedido' objeto de volta a partir da biblioteca, e eu alimentar a cadeia de resposta em um GDataXMLDocument.
GDataXMLDocument* root = [[GDataXMLDocument alloc] initWithXMLString:[request responseString] options:0 error:nil];
// Parse the error strings
NSArray* errors = [root nodesForXPath:@"//errors/error" error:nil];
// What is the first error string.... etc......
NSString* firstError = [[errors objectAtIndex:0] stringValue];
A matriz retornada aqui contém uma lista de nós que correspondem a esse caminho no XML. Se você não estiver familiarizado com XPath, não é difícil de aprender, e útil para extrair dados de uma resposta XML. Chamando stringValue contra o elemento retornado na matriz irá retornar o texto entre os elementos no exemplo acima.
Você pode, naturalmente, preencher um dicionário, etc. com os dados XML retornados. Faz sentido?