我正在开发一个非常基本的angular2 web应用程序,并且有一些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' Headers 时,它根本不起作用,我的crhome控制台中出现“无法加载资源:CONNECTION_RESET”错误...使用Rest Client时我是能够使用上面的 Headers 执行发布请求没有问题所以我迷失了为什么会发生这种情况...我必须在我的应用程序中为另一个put请求添加此标头并获得相同的结果 .
当我在省略 Headers 时查看 Headers 下的chrome dev工具网络选项卡时,我在Request Headers下看到以下 Headers :
请求标头:接受:application / json,text / plain,/ Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en; q = 0.8连接:keep-alive主机:10.60.160.34 content-type: text / plain原文:http://localhost:4200 Referer:http://localhost:4200/settings User-Agent:Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 55.0.2883.87 Safari / 537.36
当我添加 Headers 时,我在chrome dev工具的Request Headers下得到以下内容:
临时 Headers 显示Access-Control-Request-Headers:content-type Access-Control-Request-Method:GET Origin:http://localhost:4200 Referer:http://localhost:4200/settings User-Agent:Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36( KHTML,如Gecko)Chrome / 55.0.2883.87 Safari / 537.36
所以我在添加时甚至没有在 Headers 中看到我的application / json?知道为什么会发生这种情况/我能做些什么来解决它?
更新:来自chrome:// net-internals我看到以下内容:
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)
2 回答
你的代码在表面看起来很好 . 但是,您似乎可能会遇到CORS问题 . 您问题中的第二个请求实际上是GET还是OPTIONS请求?
只想确认一下 . 您可能会告诉它执行POST(或GET),但如果存在CORS问题(即某些类型的跨域请求) - 浏览器本身首先执行预检OPTIONS请求(可能不包含您的自定义集头文件) . 在CORS请求上设置“Content-type”会导致请求从“简单”请求变为“复杂”请求(触发预检OPTIONS) . 您可能正在查看此OPTIONS请求而不是您期望的实际请求 . 因此这个问题 .
您需要在构造函数中将详细信息作为对象放在http之前