使用带有GAE Python的XMLHttpRequest()PUT

时间:2015-12-05 09:24:02

标签: javascript python google-app-engine xmlhttprequest put

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

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

(注意 - 我必须使用" put"此呼叫作为要求。)

任何指导都将不胜感激!

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 个答案:

答案 0 :(得分: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;
      }
    }
  }

然后,从0.2% of all Android devices

  

如果您最终得到状态= 0和的XMLHttpRequest   statusText = null,表示不允许请求   执行。这是UNSENT。

要查看哪里出错,请检查浏览器中的javascript console是否有错误,例如:

  

[错误]无法加载XMLHttpRequest   docs。起源   Access-Control-Allow-Origin不允许http://cs496-assignment3-mastrokn.appspot.com/updatecard。   (4.htm,第0行)

当我运行上面的代码并将XMLHttpRequest发送到我自己的本地服务器时,PUT请求成功,状态代码为200.

最后,我对您发布的服务器代码有疑问,因为我不知道您从请求处理程序返回None的任何框架 - 而是返回一些字符串或响应对象。然而,使用其他方法向您的网址发出PUT请求会返回200状态代码。这真的是你的服务器代码吗?你使用什么框架?