首页 文章

Angular2:angular-http Headers非常奇怪的行为

提问于
浏览
0

我正在开发一个非常基本的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 回答

  • 1

    你的代码在表面看起来很好 . 但是,您似乎可能会遇到CORS问题 . 您问题中的第二个请求实际上是GET还是OPTIONS请求?

    只想确认一下 . 您可能会告诉它执行POST(或GET),但如果存在CORS问题(即某些类型的跨域请求) - 浏览器本身首先执行预检OPTIONS请求(可能不包含您的自定义集头文件) . 在CORS请求上设置“Content-type”会导致请求从“简单”请求变为“复杂”请求(触发预检OPTIONS) . 您可能正在查看此OPTIONS请求而不是您期望的实际请求 . 因此这个问题 .

  • 0

    您需要在构造函数中将详细信息作为对象放在http之前

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

相关问题