【发布时间】:2018-10-28 19:23:37
【问题描述】:
我需要在我的 ios 应用程序中使用 WP REST API,现在我使用的是 Alamofire 和 SwiftyJSON。
func requestAlamofireToSwiftyJSON(_ url:String, completion: @escaping (JSON?, Bool, Success) -> ()) {
let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = TIMEOUT
manager.session.configuration.timeoutIntervalForResource = TIMEOUT
manager.request(url).responseJSON { (response) -> Void in
switch response.result {
case .success:
guard let value = response.result.value else {
return
}
let json = JSON(value)
DLog(message:json)
completion(json, true, .loadOK)
case .failure(let error):
DLog(message:"failure")
DLog(message:"\n\nAuth request failed with error:\n \(error)")
if error._code == NSURLErrorTimedOut {
//HANDLE TIMEOUT HERE
completion(nil, false, .timeOut)
} else {
completion(nil, false, .loadError)
}
}
}
}
日志:
{
"code" : "rest_cannot_access",
"data" : {
"status" : 401
},
"message" : "Only authenticated users can access the REST API."
}
根据WP rest API documentation,我需要对我进行身份验证,但我不知道如何在 SWIFT 中执行此操作。
编辑 1
几乎 :) 为什么这段代码有效? JSON 显示在控制台中。
var headers: HTTPHeaders = [
"Content-Type": "application/json"
]
let user = "userblablabla"
let password = "pwdblablabla"
if let authorizationHeader = Request.authorizationHeader(user: user, password: password) {
headers[authorizationHeader.key] = authorizationHeader.value
}
Alamofire.request(url, headers:headers).responseJSON{ response in
DLog(message:url)
switch response.result {
case .success:
guard let value = response.result.value else {
return
}
let json = JSON(value)
DLog(message:json)
completion(json, true, .loadOK)
case .failure(let error):
DLog(message:"failure")
DLog(message:"\n\nAuth request failed with error:\n \(error)")
if error._code == NSURLErrorTimedOut {
//HANDLE TIMEOUT HERE
completion(nil, false, .timeOut)
} else {
completion(nil, false, .loadError)
}
}
}
为什么这段代码不起作用? 错误 401(见上文)
let headers = [ "Content-Type": "application/json","X-Requested-With": "XMLHttpRequest","Cache-Control": "no-cache"]
let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = TIMEOUT
manager.session.configuration.timeoutIntervalForResource = TIMEOUT
manager.request(url).authenticate(user: "userblablabla", password: "pwdblablabla").responseJSON { (response) -> Void in
switch response.result {
case .success:
guard let value = response.result.value else {
return
}
let json = JSON(value)
DLog(message:json)
completion(json, true, .loadOK)
case .failure(let error):
DLog(message:"failure")
DLog(message:"\n\nAuth request failed with error:\n \(error)")
if error._code == NSURLErrorTimedOut {
//HANDLE TIMEOUT HERE
completion(nil, false, .timeOut)
} else {
completion(nil, false, .loadError)
}
}
}
【问题讨论】:
-
您要访问哪个端点?
-
去年我一直在开发一个 wordpress -> 原生 iOS 应用程序。您需要确保在请求中放入带有身份验证的标头。
-
这里有一个来自 wordpress 的非常好的文档:developer.wordpress.org/rest-api/using-the-rest-api/…,您可以在其中出于开发目的在标题中发送用户和密码,或者使用 jwt 插件来获得更好、更安全的身份验证。在此处查找 jwt:wordpress.org/plugins/jwt-authentication-for-wp-rest-api
-
@JacobAhlberg 和我的管理员登录名和密码?
标签: ios json swift api alamofire