2015-12-05 3 views
2

В настоящее время я пытаюсь написать Javascript для взаимодействия с API, который я развернул в GAE (используя Python) с помощью XMXMLHttpRequest(). У меня не было проблем с получением GET, однако PUT дает мне много проблем.Использование XMLHttpRequest() PUT с GAE Python

Интересно, что у меня нет вопросов касательно запроса PUT с тестового HTTP-сайта (https://www.hurl.it/), однако я получаю значение статуса 0 каждый раз, когда я пытаюсь использовать свой собственный код Javascript. Ниже приведены фрагменты моего кода GAE и Javascript.

(ПРИМЕЧАНИЕ. - Я должен использовать «положить» для этого вызова в качестве требования)

Любое руководство будет оценен по достоинству!

GAE (Server):

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:

Если вы закончили с XMLHttpRequest, имеющим статус = 0 и statusText = null, это значит, что запрос не был выполнен в . Это был СООБЩЕНИЕ.

Чтобы понять, что пошло не так, проверьте javascript console в вашем браузере ошибки, например .:

[Error] XMLHttpRequest не может загрузить http://cs496-assignment3-mastrokn.appspot.com/updatecard. Происхождение http://localhost:4567 не разрешено Access-Control-Allow-Origin. (4.htm, линия 0)

Когда я запускаю выше код и отправить XMLHttpRequest к моему собственному локальному серверу, запрос PUT успешно с кодом 200.

Наконец, у меня есть сомнения относительно кода сервера, который вы опубликовали, потому что я не знаю какой-либо структуры, в которой вы возвращаете None из обработчика запроса - скорее вы возвращаете какую-либо строку или объект ответа. Тем не менее, используя другие способы сделать запрос PUT на ваш url возвращает код состояния 200. Это действительно ваш код сервера? Какие рамки вы используете?