我正在开发一个非常基本的angular2网络应用,并且遇到一些http标头问题......
我有以下功能:
Sub CC_Export()
Workbooks("workbook1").Sheets("Sheet1").Copy
ActiveWorkbook.SaveAs InputBox("Enter Name of New Workbook", "New Workbook"), FileFormat:=51
End Sub
当我从头文件中省略hd.append('Content-Type','application / json')语句时,我实际上从服务器得到了一个响应但它然后抱怨有效载荷是原始格式的应该是一个json。当我添加'Content-Type','application / json'标题时,它根本不起作用,我的crhome控制台中出现“无法加载资源:CONNECTION_RESET”错误... 当使用Rest客户端时,我能够使用上面的标题执行发布请求,没有任何问题,所以我迷失了为什么会发生这种情况...我必须在我的应用程序中为另一个put请求添加此标头并获取相同的内容结果
当我在省略标题时查看标题下的chrome dev工具网络选项卡时,我在请求标题下看到以下标题:
请求标头: 接受:application / json,text / plain, / Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en; q = 0.8 连接:保持活力 主持人:10.60.160.34 content-type:text / plain 来源:http://localhost:4200 推荐人: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
当我添加标题时,我在chrome dev工具的Request Headers下获得以下内容:
显示临时标头 访问控制请求标头:内容类型 访问控制请求方法:GET 来源:http://localhost:4200 推荐人: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
所以我在添加时甚至没有在标题中看到我的应用程序/ json?知道为什么会这样做/我能做些什么来解决它?
更新:来自chrome:// net-internals我看到以下内容:
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'));
}
答案 0 :(得分:1)
你的代码在表面看起来很好。但是,您似乎可能会遇到CORS问题。您问题中的第二个请求实际上是GET还是OPTIONS请求?
只是为了确保。您可能会告诉它执行POST(或GET),但如果存在CORS问题(即某些类型的跨域请求) - 浏览器本身首先执行预检OPTIONS请求(可能不包含您的自定义集头文件)。设置&#39;内容类型&#39;在CORS请求上导致请求来自简单的&#39;请求复杂的&#39;请求(触发预检选项)。您可能正在查看此OPTIONS请求而不是您期望的实际请求。因此问题。
答案 1 :(得分:0)
您需要在构造函数中将详细信息作为对象放在http
之前hd = new Header({"Content-Type" : "application/json"});