Javascript 将JSON字符串发送到cherrypy

Javascript 将JSON字符串发送到cherrypy,javascript,python,html,json,cherrypy,Javascript,Python,Html,Json,Cherrypy,我正试图通过Javascript将一个JSON字符串从一个HTML(cherrypy不提供此文件)文件发送到cherrpy服务器 这是我的最小cherrypy示例() 通过python发送JSON字符串的工作方式很温和 >>> requests.post('http://localhost:1234', json=json.dumps({'Hello': 'Json'})) <Response [200]> >>> 因此,我的单个HTML文件如

我正试图通过Javascript将一个JSON字符串从一个HTML(cherrypy不提供此文件)文件发送到cherrpy服务器

这是我的最小cherrypy示例()

通过python发送JSON字符串的工作方式很温和

>>> requests.post('http://localhost:1234', json=json.dumps({'Hello': 'Json'}))
<Response [200]>
>>> 
因此,我的单个HTML文件如下所示

<html>
<head>
<script>
function makeRequest()
{
    var insertJSON = { "my_key": "my_value" };

    var xmlhttp = new XMLHttpRequest();   // new HttpRequest instance 
    xmlhttp.open("POST", "http://localhost:1234");
    xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
    xmlhttp.send(JSON.stringify(insertJSON));

}
</script>
</head>
<body>
<form name="frm1" id="yourTextBox" onsubmit="makeRequest()">
<input type="submit" value="Submit">
</form>
</body>
</html>
我不知道我做错了什么。

您看到的选项请求是一个,显然不是JSON请求,您看到了错误。因为您是从
file://
protocol(或其他主机)打开文件的,CherryPy正在
http://127.0.0.1:1234
您执行一个跨域请求,该请求将受到限制


解决这个问题的最简单方法是通过CherryPy()提供HTML文件。困难的方法是提供适当的CORS标头以允许跨域请求(请参阅)

我同意saaj的回答,即浏览器发送CORS飞行前请求,该请求可以通过以下方式处理:

import cherrypy

class HelloJson(object):
    @cherrypy.expose
    @cherrypy.tools.json_in()
    def POST(self):
        data = cherrypy.request.json
        print(data)
        return "Hello world!"

    def OPTIONS(self):
        cherrypy.response.headers["Access-Control-Allow-Methods"] = "POST, OPTIONS"
        cherrypy.response.headers["Access-Control-Allow-Credentials"] = "true"
        cherrypy.response.headers["Access-Control-Max-Age"] = "86400"
        cherrypy.response.headers[
            "Access-Control-Allow-Headers"] = "X-Mobile, Authorization, Origin, X-Requested-With, Content-Type, Accept"
        cherrypy.response.headers["Content-Type"] = "application/json; charset=utf-8"
        return ''


if __name__ == '__main__':
    cherrypy.config.update({
            'server.socket_port':1234, 
            'request.dispatch': cherrypy.dispatch.MethodDispatcher()
    })
    cherrypy.quickstart(HelloJson(), '/')
这将起作用,因为现在您已启用API后端来侦听浏览器的选项调用,该调用告诉浏览器允许的方法和来源
cherrypy.dispatch.MethodDispatcher()
允许您将类视为方法调度器,因此您可以使用该类为RESTFUL API提供服务

<html>
<head>
<script>
function makeRequest()
{
    var insertJSON = { "my_key": "my_value" };

    var xmlhttp = new XMLHttpRequest();   // new HttpRequest instance 
    xmlhttp.open("POST", "http://localhost:1234");
    xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
    xmlhttp.send(JSON.stringify(insertJSON));

}
</script>
</head>
<body>
<form name="frm1" id="yourTextBox" onsubmit="makeRequest()">
<input type="submit" value="Submit">
</form>
</body>
</html>
[24/Aug/2015:21:10:36] HTTP 
Request Headers:
  CONNECTION: keep-alive
  ACCEPT-LANGUAGE: en-US,en;q=0.5
  ACCESS-CONTROL-REQUEST-HEADERS: content-type
  ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  USER-AGENT: Mozilla/5.0 (X11; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0
  ACCESS-CONTROL-REQUEST-METHOD: POST
  ACCEPT-ENCODING: gzip, deflate
  PRAGMA: no-cache
  CACHE-CONTROL: no-cache
  HOST: localhost:1234
  Remote-Addr: 127.0.0.1
  ORIGIN: null
[24/Aug/2015:21:10:36] HTTP Traceback (most recent call last):
  File "/usr/lib/python3.4/site-packages/cherrypy/_cprequest.py", line 670, in respond
    response.body = self.handler()
  File "/usr/lib/python3.4/site-packages/cherrypy/lib/encoding.py", line 217, in __call__
    self.body = self.oldhandler(*args, **kwargs)
  File "/usr/lib/python3.4/site-packages/cherrypy/_cpdispatch.py", line 61, in __call__
    return self.callable(*self.args, **self.kwargs)
  File "./HelloJson.py", line 15, in default
    data = cherrypy.request.json
  File "/usr/lib/python3.4/site-packages/cherrypy/__init__.py", line 224, in __getattr__
    return getattr(child, name)
AttributeError: 'Request' object has no attribute 'json'

127.0.0.1 - - [24/Aug/2015:21:10:36] "OPTIONS / HTTP/1.1" 500 1515 "" "Mozilla/5.0 (X11; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0"
import cherrypy

class HelloJson(object):
    @cherrypy.expose
    @cherrypy.tools.json_in()
    def POST(self):
        data = cherrypy.request.json
        print(data)
        return "Hello world!"

    def OPTIONS(self):
        cherrypy.response.headers["Access-Control-Allow-Methods"] = "POST, OPTIONS"
        cherrypy.response.headers["Access-Control-Allow-Credentials"] = "true"
        cherrypy.response.headers["Access-Control-Max-Age"] = "86400"
        cherrypy.response.headers[
            "Access-Control-Allow-Headers"] = "X-Mobile, Authorization, Origin, X-Requested-With, Content-Type, Accept"
        cherrypy.response.headers["Content-Type"] = "application/json; charset=utf-8"
        return ''


if __name__ == '__main__':
    cherrypy.config.update({
            'server.socket_port':1234, 
            'request.dispatch': cherrypy.dispatch.MethodDispatcher()
    })
    cherrypy.quickstart(HelloJson(), '/')