2015-07-17 2 views
0

Когда я отправляю запрос POST, все в порядке. Но когда я отправляю запрос PUT (замените $ http.post() на $ http.put()). Угловая отправка запроса OPTIONS без данных, ожидание ответа и отправка запроса PUT с данными.AngularJS: request PUT отправить запрос ОПЦИИ перед запросом PUT

Это не проблема CORPS, потому что это клиент, который отправляет 2 запроса.

Для запроса OPTIONS ответ JSON не обрабатывается, потому что угловой не переходит к функции успеха.

Я хочу Угловой не отправлять запрос ОПЦИИ. Знаете ли вы эту проблему? Вы знаете, что исправить?

Код:

var app = angular.module('myApp', []); 
app.config(function($httpProvider) { 
    delete $httpProvider.defaults.headers.common['X-Requested-With']; 
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; 
    $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; 
    $httpProvider.defaults.useXDomain = true; 
    // 
    var param = function(obj) { 
     var query = '', name, value, fullSubName, subName, subValue, innerObj, i; 
     for(name in obj) { 
      value = obj[name]; 
      if(value instanceof Array) { 
       for(i=0; i<value.length; ++i) { 
        subValue = value[i]; 
        fullSubName = name + '[' + i + ']'; 
        innerObj = {}; 
        innerObj[fullSubName] = subValue; 
        query += param(innerObj) + '&'; 
       } 
      } 
      else if(value instanceof Object) { 
       for(subName in value) { 
        subValue = value[subName]; 
        fullSubName = name + '[' + subName + ']'; 
        innerObj = {}; 
        innerObj[fullSubName] = subValue; 
        query += param(innerObj) + '&'; 
       } 
      } 
      else if(value !== undefined && value !== null) { 
       query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&'; 
      } 
     } 
     return query.length ? query.substr(0, query.length - 1) : query; 
    }; 
    // Override $http service's default transformRequest (json to application/x-www-form-urlencoded) 
    $httpProvider.defaults.transformRequest = [function(data) { 
     return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data; 
    }]; 
}); 
app.controller('login', function ($scope, $http) { 
    $scope.run = function() { 
     var file_data = $("#file").prop("files")[0]; 
     var datas = {email:"[email protected]", pass:sha1("xxxxxx")}; 
     $http.put("http://myapi.com/user/connect", datas 
      ).success(function(data, status, headers, config) { 
       console.log(data); 
      }).error(function(data, status, headers, config) { 

      }); 
     return; 
    } 
}); 

Первый запрос:

General 
Remote Address:127.0.0.1:80 
Request URL:http://api.wezit.local/user/connect 
Request Method:OPTIONS 
Status Code:200 OK 

Response Headers 
Access-Control-Allow-Methods:POST, GET, PUT, DELETE 
Access-Control-Allow-Origin:* 
Cache-Control:no-cache, must-revalidate 
Connection:Keep-Alive 
Content-Length:170 
Content-Type:application/json; 
Date:Fri, 17 Jul 2015 16:31:15 GMT 
Expires:Mon, 26 Jul 1997 05:00:00 GMT 
Keep-Alive:timeout=5, max=100 
Pragma:no-cache 
Server:Apache/2.4.10 (Fedora) PHP/5.5.25 
Set-Cookie:PHPSESSID=2dj440b2vr2emi5ht9ojcl8gk6; path=/ 
Set-Cookie:PHPSESSID=q3pg80qb43ps6tpkljlvelo0k7; path=/ 
X-Powered-By:PHP/5.5.25 

Request Headers 
Accept:*/* 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 
Access-Control-Request-Headers:accept, content-type 
Access-Control-Request-Method:PUT 
Connection:keep-alive 
Host:api.wezit.local 
Origin:http://test.local 
Referer:http://test.local/api.php 
User-Agent:Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.125 Safari/537.36 

Второй запрос:

General 
Remote Address:127.0.0.1:80 
Request URL:http://api.wezit.local/user/connect 
Request Method:PUT 
Status Code:200 OK 

Response Headers 
Access-Control-Allow-Methods:POST, GET, PUT, DELETE 
Access-Control-Allow-Origin:* 
Cache-Control:no-cache, must-revalidate 
Connection:Keep-Alive 
Content-Length:327 
Content-Type:application/json; 
Date:Fri, 17 Jul 2015 16:31:15 GMT 
Expires:Mon, 26 Jul 1997 05:00:00 GMT 
Keep-Alive:timeout=5, max=99 
Pragma:no-cache 
Server:Apache/2.4.10 (Fedora) PHP/5.5.25 
Set-Cookie:PHPSESSID=18jfhgq2fs1p1f1nu7ua1ap8c3; path=/ 
Set-Cookie:PHPSESSID=14aifglpntf8amavkipclvom67; path=/ 
X-Powered-By:PHP/5.5.25 

Request Headers 
Accept:application/json, text/plain, */* 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 
Connection:keep-alive 
Content-Length:142 
Content-Type:application/x-www-form-urlencoded; charset=UTF-8 
Host:api.wezit.local 
Origin:http://test.local 
Referer:http://test.local/api.php 
User-Agent:Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.125 Safari/537.36 

Form Data 
email:[email protected] 
pass:ce35927f4dcb044bceda5f385823419cb0156507 
+0

это браузер, не угловая, что делает OPTIONS запрос предполетной когда URL перекрестно домен , – charlietfl

+0

Я считаю, что это проблема CORS. URL-адрес Origin - это http: // test.local, а URL-адрес запроса - «http: // api.wezit.local/user/connect», поэтому его «ясно, что это кросс-доменный запрос – Arkantos

+0

Я согласен с charlietfl. . При первом обращении к междоменному запросу, если в браузере не будет сохранена копия предыдущего ответа OPTIONS, он выполнит запрос предполетной проверки. – Arkantos

ответ

2

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

Знаете ли вы эту проблему?

Нет проблем с тем, что вы наблюдали, это ожидаемое поведение.

Когда я отправляю запрос POST, все в порядке.

Here's the reason why it's OK:

В частности, запрос preflighted если:

  • Он использует отличные от GET, HEAD или POST методы. Кроме того, если POST используется для отправки данных запроса с Content-Type, отличным от application/x-www-form-urlencoded, multipart/form-data или text/plain, , например. если POST-запрос отправляет XML-полезную нагрузку на сервер с помощью приложения application/xml или text/xml, тогда запрос предваряется.
  • Он устанавливает собственные заголовки в запросе (например, запрос использует заголовок, такие как X-PINGOTHER)
+0

Спасибо всем за ваши ответы. Я действительно не решаю проблему, которую вы принимаете на правильном пути. Сначала навигатор делает запрос OPTIONS, но мои заголовки API были неправильными для этого запроса. API отключает кеш для всех запросов. Я изменил заголовки для запроса OPTIONS, чтобы включить кеш в течение одного месяца, и навигатор делает только один запрос для n запросов PUT. – Jeremy

+0

Я новичок на этом сайте, могу ли я отметить сообщение как решение? – Jeremy

+0

Да, вы можете. Если приведенный выше ответ помог вам прийти к решению, тогда вы должны просто выбрать его в качестве ответа. Это все, что вам нужно. –

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