我正在尝试了解 REST 服务器和托管 Flask 服务器。
在我得到的服务器网址上运行curl:
HTTP/1.1 200 OK
Access-Control-Allow-Methods: POST, OPTIONS, GET, HEAD
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 21600
Content-Type: text/html; charset=utf-8
Date: Sat, 28 Jun 2014 07:08:41 GMT
Server: gunicorn/19.0.0
Content-Length: 36
Connection: keep-alive
但是当我尝试从另一个网址访问其中的数据时,我得到:
XMLHttpRequest cannot load --server url--. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin --page url-- is therefore not allowed access.
到目前为止我尝试过以下代码来获取数据:
var formData = new FormData();
formData.append("name",username );
formData.append("id", userid);
var request = new XMLHttpRequest();
request.open("POST", "my-server-url");
request.send(formData);
console.log("Running Create user")
console.log("Status: "+request.status);
console.log("error: "+request.error);
console.log("responseText: "+request.responseText);
返回
Running Create user
Status: 0
error: undefined
responseText:
我尝试过使用 ajax 和 jquery,但也失败并出现与上述相同的错误
$.ajax({
url:'--server url--',
type:'POST',
data : mydata,
dataType: 'JSON',
success: function(data) {
console.log(data)
}
});
还有
$.ajax({
url:'--server url--',
type:'POST',
data : mydata,
dataType: 'JSONP',
async: false,
success: function(data) {
console.log(data)
}
});
我正在使用crossdomain decorator snippet在Python代码中。
有关我的服务器路由处理的示例:
@app.route("/", methods=['POST', 'GET', 'OPTIONS'])
@crossdomain(origin='*')
def create():
if request.method == 'POST':
name = request.form['name']
id = request.form['id']
#duplicate = collection.find_one({'name': name, 'token': token})
duplicate = collection.find_one({'id': id})
if not duplicate:
data = {'name': name,
'id': id}
collection.insert(data, safe=True)
response= make_response({'status': 'created'}, 201)
response.headers['Access-Control-Allow-Origin'] = "*"
return response
else:
response= make_response({'status': 'already exists'}, 302)
response.headers['Access-Control-Allow-Origin'] = "*"
return response
最佳答案
我终于成功解决了这个问题,我对ajax代码做了以下更改
var formData = new FormData();
formData.append("id", userid);
$.ajax({
url: '--server--',
type: 'POST',
data: formData,
processData: false,
contentType: false,
success: function(data){
//do something with data
console.log(data)
},
error: function(e) {
//handle error
console.log(e)
}
})
我也必须在服务器上进行此更改:
@app.route("/", methods=['POST', 'GET', 'OPTIONS'])
@crossdomain(origin='*')
def create():
if request.method == 'POST':
name = request.form['name']
id = request.form['id']
#duplicate = collection.find_one({'name': name, 'token': token})
duplicate = collection.find_one({'id': id})
if not duplicate:
data = {'name': name,
'id': id}
collection.insert(data, safe=True)
return jsonify({'status': 'created'}), 201
else:
return jsonify({'status': 'already exits'}), 302
关于javascript - 即使 REST 服务器设置 header ,访问控制允许来源错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24464753/