2014-06-28 52 views
2

我想了解有關REST服務器和託管瓶服務器。即使REST服務器設置標題,訪問控制允許來源錯誤

在服務器URL運行卷曲我得到:

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 

但是,當我嘗試從另一個URL訪問數據,我得到:

的XMLHttpRequest不能加載 - 服務器URL - 。請求的資源上沒有「Access-Control-Allow-Origin」標題。起源 - 頁面url - 因此不允許訪問。

到目前爲止,我還試圖讓數據下面的代碼:

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) 
       } 
      }); 

我在Python代碼中使用了crossdomain decorator snippet

對於我的服務器的路由處理一個樣本:

@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 
+0

您是否在瀏覽器的控制檯中看到OPTIONS請求?如果是這樣,你可以在你的服務器上運行curl -XOPTIONS並在這裏發佈結果嗎? – kojo

+0

@kojo感謝您的迴應。我終於找到了一個解決方法,並解決了通過ajax發送formData和設置'processData:false,contentType:false,'(現在我想弄清楚它爲什麼工作:-)的cors問題) – Wasi

回答

0

我終於設法解決這個問題,我對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 
+2

這樣你擺脫的CORS要求。如果類型是POST並且Content-Type是application/x-www-form-urlencoded(它在您的新示例中),則不是必需的。 – kojo

相關問題