从jquery ajax获取json

use*_*431 4 ajax jquery json flask

我需要一些帮助从jquery ajax获取烧瓶中的json数据.

在客户端javascript下面,只要点击某个按钮就会调用它.

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
    function change_status(item, status) {
          var statusObj={"desc":item, "status":status};
          $.ajax({
                    url:"/robot/api/"+item,
                    type: "PUT",
                    contentType:"applicaton/json",
                    dataType:"json",
                    data: JSON.stringify(statusObj)
          });
    }
</script>
Run Code Online (Sandbox Code Playgroud)

在服务器端(烧瓶),我有下面的代码来捕获json数据.

@app.route('/robot/api/<item>', methods = ['PUT'])
def update_item(item):

print "content_type: ", request.content_type

print "request.json: ", request.json

if not request.json:
    print "bad json format"
    abort(400)
else
    """
    do something like update data
    """
Run Code Online (Sandbox Code Playgroud)

在PC中,当点击浏览器中的按钮调用javascript函数时,烧瓶服务器正在打印以下消息:

"content_type:  applicaton/json; charset=UTF-8

request.json:  None

bad json format

192.168.1.241 - - [12/Feb/2014 15:06:16] "PUT /robot/api/3g HTTP/1.1" 400 -"
Run Code Online (Sandbox Code Playgroud)

它显示request.content_type是json但是在实际打印时它表示None.

我做了数据包捕获,以便通过wireshark查看来自PC的数据,我在下面看到:

从PC到Flask服务器:

PUT /robot/api/3g HTTP/1.1

Host: "my flask server ip address"

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0

Accept: application/json, text/javascript, */*; q=0.01

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Content-Type: applicaton/json; charset=UTF-8

X-Requested-With: XMLHttpRequest

Referer: "my flask server ip address"

Content-Length: 28

Connection: keep-alive

{"desc":"3g","status":"off"}
Run Code Online (Sandbox Code Playgroud)

但Flask服务器返回"HTTP/1.0 400 BAD REQUEST"

Sea*_*ira 6

这里的问题是你错过了"application/json"中的"i".将你的jQuery调用更改为contentType:"application/json"(而不是contentType:"applicaton/json"),一切都应该正常工作.

如果内容类型是application/json - 其他任何内容, Flask仅将请求体中的有效负载作为JSON 加载,您必须自己加载JSON,request.get_json(force=True)