2015-10-14 4 views
4

Я пытаюсь отправить запрос AJAX от моего ящика развития локального компьютера на сервер, используяJQuery .ajax() GET запрос отправки OPTIONS

<!DOCTYPE html> 
<html> 
<head> 
    <title>JSSample</title> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> 
</head> 
<body> 

<script type="text/javascript"> 
    $(function() { 
     var params = { 
      format: "JSON", 
      season: "2015REG" 
      // Request parameters 
     }; 

     $.ajax({ 
      url: "https://<mysite>/sub/" + params.format + "/" + params.season, 
      beforeSend: function(xhrObj){ 
       // Request headers 
       xhrObj.setRequestHeader("Ocp-Apim-Subscription-Key","<mykey>"); 
      }, 
      type: "GET" 
     }) 
     .done(function(data) { 
      alert("success"); 
      console.log("Data: \n" + JSON.stringify(data)); 
     }) 
     .fail(function(error) { 
      alert("error"); 
      console.log("Error" + JSON.stringify(error)); 
     }); 
    }); 
</script> 
</body> 
</html> 

, когда я смотрю в Firefox я вижу, что это на самом деле отправив OPTIONS запрос, на который не ответил сервер (404 не найден), поэтому я получаю ошибку с перекрытием запроса на перекрестный запрос.

OPTIONS 
XHR 
https://mysite [HTTP/1.1 404 Resource Not Found 2437ms] 
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://mysite (Reason: CORS header 'Access-Control-Allow-Origin' missing). 

Что я делаю неправильно? Почему jquery пытается задать параметры, когда я явно отправляю GET? Кроме того, у меня нет этого сервера, его другой компании, у которой есть API подписки, поэтому я не могу предоставить ключ или что-нибудь, что поможет устранить неполадки.

ответ

1

Если другой сервер принадлежит вам, вы можете включить cors

В противном случае вы не можешь (в большинстве случаев *) делают запросы на иностранный домен через ajax

JavaScript и веб-программирования увеличились на прыжки и ограничения по сравнению с годами, но политика одного и того же происхождения все еще остается. Это предотвращает выполнение запросов по границам домена , а порождает различные хаки для выполнения междоменных запросов.

CORS представляет стандартный механизм, который может использоваться всеми браузерами для реализации междоменных запросов. Спецификация определяет набор заголовков , которые позволяют браузеру и серверу обмениваться информацией о том, какие запросов являются (и не разрешены). CORS продолжает поддерживать открытую сеть , предоставляя API доступ ко всем.


Один из способов обойти CORS использует whateverorigin.org, вот пример.

$.getJSON('http://whateverorigin.org/get?url=' + encodeURIComponent('http://google.com') + '&callback=?', function(data){ 
    alert(data.contents); 
}); 
+0

Извините, я просто обновил вопрос, чтобы сказать, что у меня не было сервера. Тем не менее, я смог использовать приложение Chrome RestClient для проверки запроса, и он успешно работает с этим клиентом. Означает ли это, что я делаю что-то неправильно в своем коде? – Derek

+0

[JSONP] (http://dev.socrata.com/docs/cors-and-jsonp.html) может быть другой альтернативой - но казалось бы, что OP делает что-то по своей сути неправильно, если он сталкивается с этим. –

+0

@Derek вы можете обновить свой вопрос с помощью полного кода. –

1

Предполетный (это то, что происходит) для CORS делается при

  • метод запроса не GET, HEAD или POST; или
  • пользовательский заголовок запроса используется

В вашем случае, пользовательский заголовок запуск предполетных

Эффективен, ваш запрос CORS отвергаются сервер. Из того, что вы опубликовали, вам нужен пользовательский заголовок в запросе, поэтому удаленному серверу необходимо обрабатывать запросы перед полетом, если он должен предлагать ресурсы CORS.

Возможно, сервер, который вы пытаетесь использовать, не установлен чтобы разрешить клиентские (браузерные) подключения, только «серверные» соединения, у которых нет ограничений на перекрестное происхождение

+0

Итак, любая идея, почему это работает, когда я использую приложение RestClient для Chrome, чтобы проверить соединение, но не тогда, когда я просто делаю эту простую страницу и загружаю ее на localhost? – Derek

+0

поскольку хром-приложения не являются веб-страницами, поэтому не требуются заголовки ответа CORS с сервера. Теоретически, вы могли бы написать надстройку хром для работы как своего рода прокси для своего запроса, если хотите. В качестве альтернативы, используйте ваш сервер для проксирования запроса для клиента –

+0

@Jaromanda X, просто хочу поблагодарить вас за упоминание пользовательского заголовка ... преследовали это в течение нескольких дней, и этот комментарий сделал трюк. – GDP

Смежные вопросы