更新 对我来说,问题一经解决,就在我的请求中添加了“ 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中,相同的请求方法可以正常工作。 真的很感谢您的帮助,因为我很忙,不知道要做什么。我希望我不要误解一些必不可少的东西。 预先谢谢你!
答案 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.
}
与您的帖子唯一不同的是,我使用了编码选项。您可以尝试放置该选项,然后看看会发生什么。