【问题标题】:How to use Wordpress REST API in iOS app?如何在 iOS 应用程序中使用 Wordpress REST API?
【发布时间】: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)
            }
        }
    }

【问题讨论】:

标签: ios json swift api alamofire


【解决方案1】:

好吧@cmii,API调用的指针很少,你应该考虑一下:

根据您的问题,您需要传递一些带有用户访问令牌的请求标头。我在我的一个项目中使用了以下标题:

headers = [ "Content-Type": "application/json",
            "X-Requested-With": "XMLHttpRequest"                    
            "Cache-Control": "no-cache",
            "Authorization": "bearer " + "KJF73RWHFI23R" ]

来自您分享的链接wordpress。您需要在请求头中设置X-WP-Nonce

$.ajax( {
    url: wpApiSettings.root + 'wp/v2/posts/1',
    method: 'POST',
    beforeSend: function ( xhr ) {
        xhr.setRequestHeader( 'X-WP-Nonce', wpApiSettings.nonce );
    },
    data:{
        'title' : 'Hello Moon'
    }
} ).done( function ( response ) {
    console.log( response );
} );

除了 网址Alamofire.SessionManager 的请求中几乎没有其他参数:

  • 方法 - HTTP 方法(get、post、put、delete 等)
  • 参数 - 我们希望在正文中发送的参数
  • 编码 - 响应编码
  • 标头 - HTTP 请求标头

您可以验证响应状态码为validate(statusCode: 200..<300),只有响应状态码在200到300之间才会成功。

更新后的代码如下所示:

        let manager = Alamofire.SessionManager.default
        manager.session.configuration.timeoutIntervalForRequest = TIMEOUT
        manager.session.configuration.timeoutIntervalForResource = TIMEOUT

        // USE methods, parameters, encoding and headers as per your requirement
        // for example
        // manager.request(url, method: .get, headers: <header dictionary>)

        manager.request(url, method: .post, parameters: [:], encoding: JSONEncoding.default, headers: [:]).validate(statusCode: 200..<300).responseJSON { (response) 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)
                }
            }
        }

【讨论】:

  • 谢谢,我现在正在使用他们的 OAuth 插件(文档中推荐),我现在有一个客户端密钥和客户端密码。如何将其 in token 转换为 header?
  • 会有一些参数需要同时传递这两个参数。就像wpApiSettings.nonce 在参数键中传递 - X-WP-Nonce
  • 使用您的解决方案 + 带有基本身份验证的标头,我遇到此错误:身份验证请求失败并出现错误:responseValidationFailed(Alamofire.AFError.ResponseValidationFailureReason.unacceptableStatusCode(400))
【解决方案2】:

您似乎缺少用于访问数据的用户名和密码的标题。我可以提到的另一件事是确保将其设为私有。否则其他用户可以访问 wordpress 调用并可能编辑帖子和内容。

var headers: HTTPHeaders = [:]

// Pass in the username and the password in the authorizationHeader
if let authorizationHeader = Request.authorizationHeader(user: YOURUSERNAME, password: YOURPASSWORD) {
    headers[authorizationHeader.key] = authorizationHeader.value
}

// Request with headers
Alamofire.request(url, method: .get, headers: headers).responseJSON { (response) in
    switch response.result {
    case .success(let value):
        // Handle success
    case .failure(let error):
        // Handle error
    }
}

【讨论】:

  • 谢谢!但我需要改用 Alamofire.SessionManager :)
猜你喜欢
  • 2017-09-26
  • 2020-02-19
  • 1970-01-01
  • 2021-07-05
  • 2011-12-30
  • 1970-01-01
  • 2022-11-23
  • 2015-08-09
  • 2016-03-15
相关资源
最近更新 更多