$ Http.post от Angular не работает, как и $http..., но jQuerys ajax работает. Зачем?

По какой-то причине это:

return jquery.ajax('my url', {
    crossDomain : true
  , data : JSON.stringify({"brand": self.current})
  , type : 'POST'
  }).success(function(data){
    scope.results = data;
  });

и / или это:

curl -X POST -H "Content-Type: application/json" -d '{"brand":"target"}' myUrl

отлично работает, но это:

var req = {
  method: "POST"
, url : "my url"
, data : JSON.stringify({"brand": self.current})
};

return $http(req).
  success(function(data){
    scope.results = data;
});

неудачно с

"ОПЦИИ мой url (анонимная функция) @ angular.js: 9866sendReq @ angular.js: 9667 $ get.serverRequest @ angular.js: 9383processQueue @ angular.js: 13248 (анонимная функция) @ angular.js: 13264 $ get.Scope. $ eval @ angular.js: 14466 $ get.Scope. $ digest @ angular.js: 14282 $ get.Scope. $ apply @ angular.js: 14571 (анонимная функция) @ angular.js: 21571jQuery.event.dispatch @ jquery.js: 4430jQuery.event.add.elemData.handle @ jquery.js: 4116

(индекс): 1 XMLHttpRequest не может загрузить мой URL. В запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Источник ' http://localhost:5000/ ', следовательно, не имеет доступа. Ответ имеет HTTP-код состояния 404. "


Это один и тот же URL. Wtf. У меня есть подлое подозрение, что опция "crossDomain: true" в jquery - это то, почему jquery один работает, но если это так, то вопрос таков:

как мне сделать это с угловым?

- При использовании jjery-метода ajax по умолчанию область не обновляется с результатами, но я знаю, что данные назначаются, потому что я выхожу из системы, и если я снова отправляю запрос, область обновляется со второй значение.

Второй вопрос - почему мой взгляд не обновляется с результатами?


Обновить:

Причина, по которой это не помогло, не имеет ничего общего с ответом, который я получаю от сервера, проблема в том, что Angular преобразует этот запрос POST в запрос OPTIONS: (взят из инструмента xhr Google chromes:)

Remote Address: the remote address
Request URL:the request endpoint
Request Method:OPTIONS <-------------
Status Code:404 Not Found

Дальнейшая проверка показывает:

OPTIONS /my url HTTP/1.1 <--------------
Host: my urls host
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: http://localhost:5000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
Access-Control-Request-Headers: accept, charset, content-type
Accept: */*
Referer: http://localhost:5000/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

это не то, что нужно делать, потому что я специально говорю в объекте req, что передаю $ http, что это запрос POST.

...

Так как мне сделать угловой... НЕ так?

Кроме того, почему он это делает?

1 ответ

Когда вы выполняете запрос перекрестного происхождения из своего браузера, все браузеры нажимают на URL-адрес (предоставленный в вызове AJAX), чтобы подтвердить, доступен ли запрос перекрестного происхождения или нет, который известен как предварительный запрос. https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

Таким образом, конечная точка вашего сервера должна разрешить предварительный запрос, чтобы этот вызов работал, установив некоторые заголовки ответа, такие как (пример в Groovy):

response.setHeader "Access-Control-Allow-Headers", "Content-Type"
response.setHeader "Access-Control-Allow-Methods", "POST,DELETE,PUT"
response.setHeader "Access-Control-Allow-Origin", "*"
Другие вопросы по тегам