【问题标题】:Using XMLHttpRequest() PUT with GAE Python在 GAE Python 中使用 XMLHttpRequest() PUT
【发布时间】:2016-03-10 06:24:50
【问题描述】:

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

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

(注意 - 我必须为此调用使用“放置”作为要求。)

任何指导将不胜感激!

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>

【问题讨论】:

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


    【解决方案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

    如果您最终得到一个状态=0 的 XMLHttpRequest 并且 statusText=null,表示请求不被允许 执行。未发送。

    要查看问题所在,请检查浏览器中的 javascript console 是否有错误,例如:

    [错误] XMLHttpRequest 无法加载 http://cs496-assignment3-mastrokn.appspot.com/updatecard。起源 访问控制允许来源不允许http://localhost:4567。 (4.htm, 第 0 行)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-22
      • 2018-04-23
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多