1

我们正在创建一个小项目,其中我们将flask 作为前端和基于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)
        (...)

基于 Flask 的网站正在大喊:

ValueError: No JSON object could be decoded

我们不知道如何协调烧瓶和restlet之间的通信。

编辑(格林威治标准时间 22-04 晚上 10:08):我发现回复是:

<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:26):我仍然不确定为什么,但我认为它可能是 JSON 格式的东西。在更正我的代码以便它发送正确的 JSON(说 JSONLint)之后,我仍然收到相同的消息。有人知道如何在 Python 中创建 JSONObject 吗?WebService 有方法:

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

编辑(格林威治标准时间 23-04 下午 7:26):好的。所以我们几乎可以肯定这是不可见标题的问题。任何人都可以确认这里在 python 代码中创建的标头是正确的吗?

编辑(格林威治标准时间 24-04 下午 5:40):问题仍然存在。正如其他一些建议,我将请求更改回 urllib2。这有助于解决第一件事——“价值问题”。现在浏览器有

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

现在发布请求:

@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()

编辑(格林威治标准时间 24-04 下午 6:20)

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

行。解决方案比我想象的要容易。

问题出在 WebService 方面。它是通过将 JSONObject 更改为 JsonRepresentation 来解决的:

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

除了 Blender 的观点(这更可能是罪魁祸首),值得一提的是 content-type 应该设置为application/json而不是json.

于 2013-04-22T21:36:01.417 回答
1

要添加危害响应,我必须编辑@Post("json")@Post("application/json")

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