2017-01-13 7 views
0

Я работаю на очень простой angular2 веб-приложение и некоторые проблемы с HTTP заголовками ...Angular2: угловой HTTP Headers очень странное поведение

У меня есть следующие функции:

postStockTake(stockTakeModel: StockTakeModel) : Observable<Response> { 
let body = JSON.stringify(stockTakeModel); 
     let hd = new Headers(); 
     hd.append('Content-Type', 'application/json');  
     return this.http.post(ApiUrl, body, {headers: hd}) 
     .map((res: Response) => res.json()) 
     .catch((error: any) => Observable.throw(error.json().error || 'server error')); 
    } 

Когда Я опускаю инструкцию hd.append ('Content-Type', 'application/json') из заголовков, на которых я действительно получаю ответ от сервера, но затем жалуется на то, что полезная нагрузка находится в необработанном формате, когда она должна быть json. Когда я добавляю заголовок Content-Type, 'application/json', он вообще не работает, и я получаю сообщение об ошибке «Не удалось загрузить ресурс: CONNECTION_RESET» в моей консоли crhome ... При использовании Rest Rest I я могу сделать запрос на отправку с указанным выше заголовком без каких-либо проблем, поэтому я теряюсь относительно того, почему это происходит ... Я должен добавить этот заголовок для другого запроса на перенос в моем приложении и получить те же результаты.

Когда я смотрю под хромом Девых инструментов вкладки под заголовками сетевых когда Опуская заголовок я вижу следующие заголовки под заголовками запроса:

заголовков запроса: Accept: приложения/JSON, текст/равнина, / Accept-Encoding: GZIP, выкачать, SDCH Accept-Language: EN-US, еп, д = 0,8 Подключение: держать-жив Ведущий: 10.60.160.34 типа содержимого: текст/обычный Происхождение: http://localhost:4200 Referer : http://localhost:4200/settings Пользователь -Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537,36 (KHTML, как Gecko) Chrome/55.0.2883.87 Safari/537,36

Когда я добавить заголовок я получаю следующее под Request Headers в хромовых Дев инструментов:

Временные заголовки показаны доступа -Управление-Request-заголовки: тип содержимого Access-Control-Request-метод: GET Происхождение: http://localhost:4200 Referer: http://localhost:4200/settings User-Agent: Mozilla/5.0 (Windows NT 10,0; Win64; x64) AppleWebKit/537,36 (KHTML , как Gecko) Хром/55.0.2883.87 Safari/537.36

Так что я d даже не вижу мое приложение/json в заголовках при его добавлении? Любая идея, почему это произойдет/что я могу сделать, чтобы исправить это?

обновление: из хрома: // нетто-Внутренности я вижу следующее:

http://10.60.160.34/BRMServices/WebEnquiry/StockTake/AddToStockTake 
Start Time: 2017-01-13 14:44:30.800 
t=19711 [st=0] +REQUEST_ALIVE [dt=3] 
t=19711 [st=0] URL_REQUEST_DELEGATE [dt=0] 
t=19711 [st=0] +URL_REQUEST_START_JOB [dt=3] 
        --> load_flags = 34624 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | MAYBE_USER_GESTURE | VERIFY_EV_CERT) 
        --> method = "OPTIONS" 
        --> priority = "MEDIUM" 
        --> url = "http://10.60.160.34/BRMServices/WebEnquiry/StockTake/AddToStockTake" 
t=19711 [st=0]  URL_REQUEST_DELEGATE [dt=0] 
t=19711 [st=0]  HTTP_CACHE_GET_BACKEND [dt=0] 
t=19711 [st=0]  +HTTP_STREAM_REQUEST [dt=1] 
t=19711 [st=0]  HTTP_STREAM_REQUEST_STARTED_JOB 

--> source_dependency = 6474 (HTTP_STREAM_JOB) 

t=19712 [st=1]  HTTP_STREAM_REQUEST_BOUND_TO_JOB 

--> source_dependency = 6474 (HTTP_STREAM_JOB) 

t=19712 [st=1]  -HTTP_STREAM_REQUEST 
t=19712 [st=1]  +HTTP_TRANSACTION_SEND_REQUEST [dt=0] 
t=19712 [st=1]  HTTP_TRANSACTION_SEND_REQUEST_HEADERS 
         --> OPTIONS /BRMServices/WebEnquiry/StockTake/AddToStockTake HTTP/1.1 
          Host: 10.60.160.34 
          Connection: keep-alive 
          Access-Control-Request-Method: POST 
          Origin: http://localhost:4200 
          User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 
          Access-Control-Request-Headers: content-type 
          Accept: */* 
          Referer: http://localhost:4200/stockTake 
          Accept-Encoding: gzip, deflate, sdch 
          Accept-Language: en-US,en;q=0.8 
t=19712 [st=1]  -HTTP_TRANSACTION_SEND_REQUEST 
t=19712 [st=1]  +HTTP_TRANSACTION_READ_HEADERS [dt=2] 
t=19712 [st=1]  HTTP_STREAM_PARSER_READ_HEADERS [dt=2] 
         --> net_error = -101 (ERR_CONNECTION_RESET) 
t=19714 [st=3]  -HTTP_TRANSACTION_READ_HEADERS 
        --> net_error = -101 (ERR_CONNECTION_RESET) 
t=19714 [st=3] -URL_REQUEST_START_JOB 
        --> net_error = -101 (ERR_CONNECTION_RESET) 
t=19714 [st=3] URL_REQUEST_DELEGATE [dt=0] 
t=19714 [st=3] -REQUEST_ALIVE 
       --> net_error = -101 (ERR_CONNECTION_RESET) 
+0

GET-запрос normaly не использует заголовки Content-Type, но заголовок Accept. Вы уверены, что вам нужно использовать заголовок Content-Type здесь? – DGD

+0

Ваш код отлично выглядит на поверхности. Однако, похоже, вы можете столкнуться с проблемами CORS. Является ли вторая просьба в вашем вопросе на самом деле GET или это может быть запрос OPTIONS? – MikeOne

+0

@MikeOne Второй запрос, который не добавлен в этот вопрос, где я начал сталкиваться с этой проблемой, был Post. Этот запрос ping - это получить хотя бы ... Я попробовал здесь, чтобы реплицировать проблему, с которой я столкнулся с запросом Post в этом запросе get, чтобы узнать, ведет ли он себя так же (что он делает ... – user2094257

ответ

1

Вы код выглядит мелкий на поверхности. Однако, похоже, вы можете столкнуться с проблемами CORS. Является ли вторая просьба в вашем вопросе на самом деле GET или это может быть запрос OPTIONS?

Просто, чтобы убедиться. Вы можете сказать, что он делает POST (или GET), но если есть проблемы с CORS (т. Е. Междоменный запрос определенных типов) - сам браузер сначала выполняет запрос предварительной проверки OPTIONS (который может не содержать ваши настраиваемые заголовки набора). Установка «Content-type» в запросе CORS приводит к тому, что запрос переходит от «простого» запроса к «сложному» запросу (вызывая предварительные опции OPTIONS). Вы можете посмотреть этот запрос OPTIONS вместо фактического запроса, который вы ожидаете. Отсюда вопрос.

+0

Еще раз спасибо @MikeOne. Так что, если я правильно понимаю, запросы на получение запросов работали до того, как это был кросс-домен, потому что он не вызывал заголовки предполетных заголовков, поскольку я не добавлял заголовок содержимого в запрос? – user2094257

+0

Действительно! Вероятно, это была причина. – MikeOne

0

Вы должны поместить детали в конструкторе, как объект, прежде чем HTTP

hd = new Header({"Content-Type" : "application/json"}); 
+0

Я изначально сделал это так и получил ту же ошибку, поэтому я попытался это так ... – user2094257