Eu gostaria de recuperar o código de status da resposta HTTP (por exemplo, 400, 401, 403, 503, etc) para falhas de solicitação (e de preferência para sucessos também). Neste código, estou executando a autenticação do usuário com HTTP Basic e quero ser capaz de enviar uma mensagem ao usuário que a autenticação falhou quando o usuário digita incorretamente a senha.
Alamofire.request(.GET, "https://host.com/a/path").authenticate(user: "user", password: "typo")
.responseString { (req, res, data, error) in
if error != nil {
println("STRING Error:: error:\(error)")
println(" req:\(req)")
println(" res:\(res)")
println(" data:\(data)")
return
}
println("SUCCESS for String")
}
.responseJSON { (req, res, data, error) in
if error != nil {
println("JSON Error:: error:\(error)")
println(" req:\(req)")
println(" res:\(res)")
println(" data:\(data)")
return
}
println("SUCCESS for JSON")
}
Infelizmente, o erro produzido não parece indicar que um código de status HTTP 409 foi realmente recebido:
STRING Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
res:nil
data:Optional("")
JSON Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
res:nil
data:nil
Além disso, seria bom recuperar o corpo HTTP quando ocorrer um erro, porque meu lado do servidor colocará uma descrição textual do erro lá.
Perguntas
É possível recuperar o código de status após uma resposta não 2xx?
É possível recuperar o código de status específico após uma resposta 2xx?
É possível recuperar o corpo HTTP após uma resposta não 2xx?
Obrigado!
Respostas:
Para usuários Swift 3.x / Swift 4.0 / Swift 5.0 com Alamofire> = 4.0 / Alamofire> = 5.0
Exemplo mais detalhado:
(Alamofire 4 contém um sistema de erro completamente novo, veja aqui para detalhes)
Para usuários Swift 2.x com Alamofire> = 3.0
fonte
StatusCodeValidationFailed
,FAILURE: Error Domain=com.alamofire.error Code=-6003
. Se você realmente deseja obter um erro de resposta HTTP, é melhor para o usuárioresponse.response?.statusCode
No manipulador de conclusão com o argumento
response
abaixo, acho que o código de status http está emresponse.response.statusCode
:fonte
fonte
A melhor maneira de obter o código de status usando alamofire.
fonte
Ao
responseJSON
concluir, você pode obter o código de status do objeto de resposta, que tem um tipo deNSHTTPURLResponse?
:Isso funcionará independentemente de o código de status estar na faixa de erro. Para obter mais informações, dê uma olhada na documentação NSHTTPURLResponse .
Para sua outra pergunta, você pode usar a
responseString
função para obter o corpo da resposta bruta. Você pode adicionar isto além deresponseJSON
e ambos serão chamados.fonte
Seu erro indica que a operação está sendo cancelada por algum motivo. Precisaria de mais detalhes para entender o porquê. Mas acho que o maior problema pode ser que, como seu endpoint
https://host.com/a/path
é falso, não há uma resposta real do servidor para relatar e, portanto, você está vendonil
.Se você atingir um endpoint válido que forneça uma resposta adequada, deverá ver um valor não nulo para
res
(usando as técnicas mencionadas por Sam) na forma de umNSURLHTTPResponse
objeto com propriedades comostatusCode
etc.Além disso, só para ficar claro,
error
é do tipoNSError
. Ele informa por que a solicitação de rede falhou. O código de status da falha no lado do servidor é, na verdade, uma parte da resposta.Espero que ajude a responder sua pergunta principal.
fonte
res
objeto énil
, então esta resposta não ajuda, desculpe.error
estivesse me referindo a respostas com códigos de status que estão fora do intervalo que fornecemosvalidate()
. Obrigado!!!Ou use correspondência de padrões
fonte
você pode verificar o seguinte código para manipulador de código de status por alamofire
se o código de status não for validado, será inserido a falha no caso de troca
fonte
Para usuários Swift 2.0 com Alamofire> 2.0
fonte
Eu precisava saber como obter o número do código de erro real.
Eu herdei um projeto de outra pessoa e tive que obter os códigos de erro de uma
.catch
cláusula que eles haviam configurado anteriormente para Alamofire:Ou se você precisar obtê-lo do
response
valor siga a resposta de @mbryzinskifonte