Alamofire 5 (бета 6): параметры запроса PUT не поступают в Flask-Restful - PullRequest
1 голос
/ 15 июня 2019

ОБНОВЛЕНИЕ Для меня проблема была исправлена, как только я вставил в свой запрос "encoding: URLEncoding (destination: .queryString)".Может быть, это помогает кому-то еще. ссылка

Я целый день пытался найти проблему в моем запросе PUT Alamofire или в API Flask Restful.Такие запросы как GET, DELETE и POST работают нормально с Alamofire , , за исключением запроса PUT. Когда я использую запросы PUT в сочетании с Почтальон и Flask-Restful все также работает нормально.Но как только я пытаюсь достичь того же результата с Alamofire , я не получаю никаких параметров во Flask.Я попытался проиллюстрировать это в примерах кода.

Итак, вкратце мой пример иллюстрирует следующее:

DELETE Request (То же самое с 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')

Если я использую Почтальон, я получаю этот результат (как и ожидалось): Результатв Почтальоне

Но сейчас я пытаюсь сделать то же самое с Alamofire в Swift.Тот же сервер, ничего не изменилось.

Демонстрационный код 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 голосов
/ 17 июня 2019

В настоящее время я использую ту же версию 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.
}

Единственное отличие вашего поста в том, что я использовал опцию кодирования.Вы можете попробовать поставить опцию и посмотреть, что произойдет.

0 голосов
/ 17 июня 2019

Похоже, ваш сервер ожидает, что ваши PUT параметры будут иметь форму URL, закодированную в URL.Возможно, вы используете версию метода request, которая по умолчанию использует кодировку JSON, поэтому добавление encoder: URLEncodedFormParameterEncoder.default в конце вашего вызова request должно исправить это.В будущем выпуске это будет по умолчанию, так как это безопасно для всех типов запросов.

Если это не проблема, я предлагаю вам более внимательно изучить, чтобы увидеть, какие могут быть различия между запросами.Поскольку вы контролируете сервер, у вас должен быть легкий доступ к трафику.

...