2015-12-05 61 views
2

我目前正在尝试编写一些JavaScript与我使用XMXMLHttpRequest()在GAE(使用Python)上部署的API进行交互。我没有获得GET的问题,但是PUT给我带来了很多麻烦。使用XMLHttpRequest()PUT与GAE Python

有趣的是,我从测试HTTP站点(https://www.hurl.it/)触摸PUT请求没有问题,但是每次尝试从我自己的Javascript代码中收到状态值0。以下是我的GAE和Javascript代码的片段。

(注意 - 我必须用一个“放”该呼叫的要求)

任何指导,将不胜感激!

GAE(服务器):

def put(self): 

# Save variables for update 
cardkey = self.request.get('key', default_value=None) 
ident = self.request.get('ident', default_value=None) 
brand = self.request.get('brand', default_value=None) 
year = self.request.get('year', default_value=None) 
player = self.request.get('player', default_value=None) 

# If card key is provided then update card 
if cardkey: 
    # Get card 
    card_to_update = ndb.Key(db_models.Card, int(cardkey)).get() 
    if ident: 
    card_to_update.ident = ident 
    if brand: 
    card_to_update.brand = brand 
    if year: 
    card_to_update.year = year 
    if player: 
    card_to_update.player = player 
    # Save changes and print update to requester 
    card_to_update.put() 
    card_dict_format = card_to_update.to_dict() 
    self.response.write(json.dumps(card_dict_format)) 
    return 

# If card key is not provided send error 
else: 
    self.response.write('key not provided. must provide key for update.') 
    return 

而且从我的网页上的JavaScript:

 <script> 
     window.onload = function() 
     { 
      var myRequest = new XMLHttpRequest(); 
      var url = 'http://cs496-assignment3-mastrokn.appspot.com/updatecard'; 
      var param = 'key=5636318331666432'; 
      myRequest.open('put', url); 


      myRequest.onreadystatechange = function() 
      { 
       if ((myRequest.readyState == 4) && (myRequest.status == 200)) 
       { 
        // var myArr = JSON.parse(myRequst.responseText); 
        // myFunction(myArr); 
        document.getElementById("viewCards").innerHTML = myRequest.status; 

       } 
       else 
       { 
        document.getElementById("viewCards").innerHTML = myRequest.status; 
       } 
      } 

      myRequest.send(param); 
     } 
    </script> 

回答

1

首先,你onreadystatechange()处理程序应该是这样的:

myRequest.onreadystatechange = function() 
    { 
    if (myRequest.readyState == 4) //Don't do anything until the readyState==4 
    { 
     if(myRequest.status == 200) //Check for status==200 
     { 
      document.getElementById("viewCards").innerHTML = myRequest.status; 
     } 
     else //All other status codes 
     { 
      document.getElementById("viewCards").innerHTML = 
      'readyState=' 
      + myRequest.readyState 
      + ' status=' 
      + myRequest.status 
      + ' status text=' 
      + myRequest.statusText; 
     } 
    } 
    } 

然后, docs

如果最终得到status = 0和 status = null的XMLHttpRequest,则表示该请求不允许为 执行。这是不安全的。

要看看哪里出了问题,请检查您的浏览器javascript console的错误,例如:

[错误]的XMLHttpRequest无法加载 http://cs496-assignment3-mastrokn.appspot.com/updatecard。 Access-Control-Allow-Origin不允许使用原产地 http://localhost:4567。 (4.htm,线0)

当我运行上面的代码,并发送了XMLHttpRequest我自己的本地服务器,PUT请求与200

最后的状态代码是否能够成功,我有您对发布的服务器代码有所怀疑,因为我不知道任何从请求处理程序返回无的框架 - 而是返回一些字符串或响应对象。但是,使用其他方式向您的url发出PUT请求会返回200状态代码。这真的是你的服务器代码?你在用什么框架?