Alamofire 5(测试版6):PUT请求的参数未在Flask-Restful中到达

时间:2019-06-15 19:53:57

标签: python swift flask alamofire

更新 对我来说,问题一经解决,就在我的请求中添加了“ encoding:URLEncoding(destination:.queryString)”。也许这可以帮助其他人。 link

我整天都在努力寻找问题,以便在Alamofire PUT请求或Flask Restful API中找到问题。像GET,DELETE和POST这样的请求可以与 Alamofire (PUT请求除外)一起正常使用。 当我将PUT请求与 Postman Flask-Restful 结合使用时,一切也都可以正常工作。但是,当我尝试使用 Alamofire 获得相同的结果时,我在Flask中没有任何参数。我试图在代码示例中对此进行说明。

因此,简而言之,我的示例说明了以下内容:

删除请求(与GET和POST相同)

邮递员:成功

Alamofire:成功

PUT请求

邮递员:成功

Alamofire:失败(Flask-Restful中参数字典为空)

这是我的Python代码[API服务器]:

from flask import Flask, request, jsonify
from flask_restful import Resource, Api, reqparse


app = Flask(__name__)
api = Api(app)
class Stackoverflow(Resource):
    def delete(self):
        print(request.args)
        if request.args.get('test-key') is None:
            return jsonify({"message": "failure"})
        else:
            return jsonify({"message": "success"})

    def put(self):
        print(request.args)
        if request.args.get('test-key') is None:
            return jsonify({"message": "failure"})
        else:
            return jsonify({"message": "success"})

api.add_resource(Stackoverflow, '/stackoverflow')
if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

如果我使用的是Postman,我会得到以下结果(如预期的那样): Result in Postman

但是现在我正在尝试在Swift中对Alamofire进行同样的操作。同一台服务器,没有任何更改。

SWIFT演示代码[IOS APP]:

import UIKit
import Alamofire
import SwiftyJSON

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view
        simplePUTRequest()
        simpleDELETERequest()

}

    func simplePUTRequest(){

        AF.request("http://localhost:5000/stackoverflow", method: .put, parameters: ["test-key":"testvalue"])
            .validate(statusCode: 200..<300)
            .responseJSON { response in

                if let data = response.data {

                    print("Result PUT Request:")
                    print(String(data: data, encoding: .utf8)!)
                    //print(utf8Text)
                }else{

                }
    }
    }

    func simpleDELETERequest(){

        AF.request("http://localhost:5000/stackoverflow", method: .delete, parameters: ["test-key":"testvalue"])
            .validate(statusCode: 200..<300)
            .responseJSON { response in

                if let data = response.data {

                    print("Result DELETE Request:")
                    print(String(data: data, encoding: .utf8)!)
                    //print(utf8Text)
                }else{

                }
        }
    }

Xcode控制台:

Result PUT Request:
{
  "message": "failure"
}

Result DELETE Request:
{
  "message": "success"
}

python控制台(两个Alamofire请求):

ImmutableMultiDict([])
127.0.0.1 - - [15/Jun/2019 21:17:31] "PUT /stackoverflow HTTP/1.1" 200 -
ImmutableMultiDict([('test-key', 'testvalue')])
127.0.0.1 - - [15/Jun/2019 21:17:31] "DELETE /stackoverflow?test-key=testvalue HTTP/1.1" 200 -

如您所见,我仅在使用DELETE方法时才收到成功消息。 到现在为止,我尝试使用不同的编码,例如URLEncoding.httpbody和URLEncoding.default,但没有任何帮助。 对我来说,这似乎是一个Alamofire / Swift问题,因为在Postman中,相同的请求方法可以正常工作。 真的很感谢您的帮助,因为我很忙,不知道要做什么。我希望我不要误解一些必不可少的东西。 预先谢谢你!

2 个答案:

答案 0 :(得分:0)

您的服务器似乎期望将PUT参数以URL形式编码到URL中。您可能正在使用默认情况下使用JSON编码的request方法的版本,因此在encoder: URLEncodedFormParameterEncoder.default调用的末尾添加request应该可以解决此问题。将来的版本会将其设置为默认值,因为在所有请求类型中它都是安全的。

如果这不是问题,建议您更仔细地调查以了解请求之间的差异。由于您控制服务器,因此应该可以轻松访问流量。

答案 1 :(得分:0)

我当前正在使用相同版本的AlamoFire,并且在使用PUT方法时,其使用方式如下:

let request = AF.request(url, method: .put, parameters: ["uid": uid],
                         encoding: JSONEncoding.default, headers: headers)
request.responseJSON(completionHandler: { response in 
    guard response.error == nil else {
        //Handle error
    }
    if let json = response.value as? [String: Any]
    // Handle result.
}

与您的帖子唯一不同的是,我使用了编码选项。您可以尝试放置该选项,然后看看会发生什么。