Ios 如何使用Alamofire 4.0发出NTML请求?
这些是请求头:Ios 如何使用Alamofire 4.0发出NTML请求?,ios,swift,alamofire,ntlm-authentication,Ios,Swift,Alamofire,Ntlm Authentication,这些是请求头: let headers: HTTPHeaders = [ "Accept": "application/json", "username": "someUserName", "password": "aPasswordForSomeUserName" ] 当用下面的代码发出请求时,它会给我“最后的垃圾”。然而,当我用JSON解析器在线检查响应时。这是一个有效的JSON Alamofire.request("http
let headers: HTTPHeaders = [
"Accept": "application/json",
"username": "someUserName",
"password": "aPasswordForSomeUserName"
]
当用下面的代码发出请求时,它会给我“最后的垃圾”。然而,当我用JSON解析器在线检查响应时。这是一个有效的JSON
Alamofire.request("http://myserver/list.svc/random", headers: headers).responseJSON { response in
print(response)
}
我也试着提出这样的请求:
Alamofire.request("http://myserver/list.svc/random", headers: headers).responseString { response in
print(response)
}
我在控制台中收到这条消息:“401未经授权”
我做错了什么?我相信,当使用responseJSON
完成块时,它并不是在抱怨未经授权
,而是在抱怨糟糕的JSON(或一些垃圾)
另外,同样的请求在Advance Rest客户端(一个chrome扩展)和chrome浏览器中也可以使用。我不知道这对您有多重要,但我有一个可行的解决方案,我将发布供将来参考 所以,我有两个问题。第一个问题是,当请求被重定向时,授权头掉到了请求的末尾。第二个是来自未处理服务器的NTLM质询。我希望下面的代码应该是不言自明的:)这意味着您将用户名和密码存储在变量名称中
let credentialData = "\(username):\(password)".data(using: String.Encoding.utf8)!
let base64Credentials = credentialData.base64EncodedString(options: [])
request.addValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization")
let manager = Alamofire.SessionManager.default
let delegate: Alamofire.SessionDelegate = manager.delegate
// This bit will re-add the auth headers for the redirected request
delegate.taskWillPerformHTTPRedirection = { session, task, response, request in
var redirectedRequest = request
if let originalRequest = task.originalRequest, let redirectheaders = originalRequest.allHTTPHeaderFields {
if let authorizationHeaderValue = redirectheaders["Authorization"] {
redirectedRequest.setValue(authorizationHeaderValue, forHTTPHeaderField: "Authorization")
}
if let contentTypeHeaderValue = redirectheaders["Content-Type"] {
redirectedRequest.setValue(contentTypeHeaderValue, forHTTPHeaderField: "Content-Type")
}
}
return redirectedRequest
}
// This bit looks at challenges received and applies the correct credentials
delegate.taskDidReceiveChallenge = { session, task, challenge in
var disposition: URLSession.AuthChallengeDisposition = .useCredential
var credential: URLCredential = URLCredential()
if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodNTLM) {
disposition = URLSession.AuthChallengeDisposition.useCredential
credential = URLCredential(user: username, password: password, persistence: URLCredential.Persistence.forSession)
}
if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
disposition = URLSession.AuthChallengeDisposition.useCredential
credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)
}
return(disposition, credential)
}
manager.request(request).responseData { (response) in
// Handle response accordingly
}
希望这对某人有所帮助。在Swift4.2 Alamofire内置了
NTLM
auth支持。
你可以提出这样的要求
let user = "YOUR_USER_NAME OR EMAIL"
let password = "YOUR_PASSWORD"
let url = "YOUR_API_URL"
let credential = URLCredential(user: user, password: password, persistence: .forSession)
//These headers are optional based on your api and your server.
//There were required for me
let headers = ["Accept": "application/json;odata=verbose",
"Content-type": "application/json;odata=verbose"]
Alamofire.request(url, method: .get, headers: headers).authenticate(usingCredential: credential).responseJSON {
(response) in
switch response.result {
case .success:
if let value = response.result.value {
print("The server response is: ", value)
}else{
print("There is error in the server response")
}
case .failure (let error):
print("The NTLM request error is: ", error.localizedDescription)
}
}