1

私たちは、Flask を FrontEnd および Restlet ベースの WebService として持つ小さなプロジェクトを作成しています。

ログインデータを JSON としてフラスコから restlet に送信しようとします。

def login():
    error = None
    if request.method == 'POST':
        payload = {'username' : request.form['username'], 'password' : request.form['password']}
        headers = {'Content-Type': 'application/json'}
        req = requests.post(WEBSERVICE_IP + '/login', data=json.dumps(payload), headers=headers)
        (...)

フラスコベースのウェブサイトは次のことを叫んでいます:

ValueError: No JSON object could be decoded

フラスコとレストレットの間の通信を調整する方法がわかりません。

編集 (22-04 10:08pm GMT) : 応答が次のとおりであることがわかりました。

<html>
(...)
Unsupported Media Type
The server is refusing to service the request because the entity of the request is in a format not supported by the requested resource for the requested method
(...)
</html>

編集 (22-04 11:26pm GMT) : 理由はまだわかりませんが、JSON 形式のものではないかと思いました。正しい JSON (JSONLint) を送信するようにコードを修正した後も、同じメッセージが表示されます。Python で JSONObject を作成する方法を知っている人はいますか? WebService にはメソッドがあります:

@Post("json")
public JSONObject verifyAccount(JSONObject dane){

編集 (2004 年 23 月 4 日午後 7 時 26 分 GMT) : わかりました。したがって、見えないヘッダーに問題があることはほぼ確実です。ここのPythonコードでのヘッダーの作成が正しいことを誰でも確認できますか?

編集 (24-04 5:40pm GMT) : 問題はまだ実際にあります。他の人が示唆したように、リクエストをurllib2に戻しました。これは、最初の「価値の問題」に役立ちました。現在、ブラウザは持っています

urllib2.HTTPError
HTTPError: HTTP Error 415: Unsupported Media Type

今すぐ POST リクエスト:

@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        payload = {"Login": request.form['username'],
            "Haslo": request.form['haslo']}
        data = json.dumps(payload)
        clen = len(data)
        req = urllib2.Request(WEBSERVICE_IP + '/login', data,
            {'Content-Type': 'application/json', 'Content-Length': clen})
        f = urllib2.urlopen(req)
        response = f.read()
        f.close()

編集 (2004 年 2 月 24 日午後 6 時 20 分 GMT) :

Wireshark が POST 要求をキャプチャし、問題ないように見えます。

Wireshark が POST 要求をキャプチャし、問題ないように見えます。

4

4 に答える 4

2

辞書の場合data、Requests はそれをシリアル化します。代わりに文字列を渡したい:

import json

req = requests.post(WEBSERVICE_IP + '/login', data=json.dumps(payload), ...
于 2013-04-22T21:31:53.663 に答える
2

Ok。解決策は思ったより簡単でした。

問題は WebService 側にありました。JSONObject を JsonRepresentation に変更することで解決されました。

@Post("json")
public JSONObject verifyAccount(JsonRepresentation data){
于 2013-04-25T16:55:31.590 に答える
1

ハザード対応を追加するには、次のように編集@Post("json")する必要がありました@Post("application/json")

@Post("application/json")
public JSONObject verifyAccount(JsonRepresentation data){
于 2013-10-21T10:28:23.687 に答える
1

Blender のポイント (犯人である可能性が高い) に加えて、 content-type は.application/jsonではなくに設定する必要があることに言及する価値がありjsonます。

于 2013-04-22T21:36:01.417 に答える