2016-06-14 4 views
2

У меня возникла проблема с настройкой заголовка приложения/json заголовка в моем почтовом запросе.Настройка заголовка запроса JSON в Angular2 HTTP POST

saveUpdates(alltabs: AllTabs): Observable<Response> { 
      let api = this.host + this.routes.save; 
      let headers = new Headers(); 
      headers.append('Content-Type', 'application/json'); 

      return this._http.post(api, JSON.stringify(alltabs), { headers: headers }) 
      .map((response: Response) => <Response>response.json()) 
      .do(data => console.log("saveUpdates(): " + data)) 
      .catch(this.handleError); 
    } 

Заголовки запросов:

OPTIONS /api/productsave HTTP/1.1 
Host: wbtest:92 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 
Access-Control-Request-Method: POST 
Origin: http://localhost:3000 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36 
Access-Control-Request-Headers: content-type 
Accept: */* 
Referer: http://localhost:3000/product/60000010080 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8 

Response Headers:

HTTP/1.1 405 Method Not Allowed 
Cache-Control: no-cache 
Pragma: no-cache 
Allow: POST 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Access-Control-Allow-Origin: * 
Date: Tue, 14 Jun 2016 15:16:15 GMT 
Content-Length: 76 

Как вы можете видеть, мой запрос две неожиданные заголовки добавлены "Access-Control-Request-Headers" и " Access-Control-Request-Method». Это, по-видимому, указывает на проблему с CORS (совместное использование ресурсов Cross-Origin). Тем не менее, файл web.conf на сервере API работает, и заголовки ответов указывают «Access-Control-Allow-Origin: *».

Любая идея, что может быть неправильным?

UPDATE:

Приведенный выше код правильно - проблема с кодом Sever не настроен для обработки запросов предполетных. В моем случае приложение .NET Web API 2 не было настроено для разрешения CORS.

ответ

3

С CORS у вас есть два вида запросов. В самом деле, спецификация CORS различает два различных случая использования:

  • Простые запросы. Этот вариант использования применяется, если мы используем методы HTTP GET, HEAD и POST. В случае методов POST поддерживаются только типы контента со следующими значениями: text/plain, application/x-www-form-urlencoded и multipart/form-data.
  • Запрограммированные заявки. Когда случай использования «простых запросов» не применяется, выполняется первый запрос (с помощью метода HTTP OPTIONS), чтобы проверить, что можно сделать в контексте междоменных запросов.

Похоже, что ваш сервер не настроен на поддержку предполетного запроса. Причина для кода состояния 405 (405 Метод не разрешен).

Смотрите эту статью для более подробной информации:

+0

Я думаю, что вы правы (Chrome этого состояния "Ответ на предполетный имеет недопустимый HTTP"), но с добавлением «<добавить имя = "Access-Control-Allow-Methods" значение = "GET, PUT, POST, DELETE, OPTIONS" /> "и" <имя-name = "Access-Control-Allow-Headers" value = "Content-Type" /> " к моему web.conf все еще дает ту же проблему. –

+0

Я не знаю, что вы используете для своего сервера, но обычно есть дела. Например, с узлом, вам нужно определить промежуточное ПО в Express для обработки методов OPTIONS. См. Https://www.npmjs.com/package/cors –

+0

Спасибо Тьерри. Похоже, что наше приложение .NET Web API 2 не настроено для обработки запросов перед полетом. –