【发布时间】:2017-09-06 13:51:24
【问题描述】:
我正在尝试使用 TypeScript 和 JQuery(来自绝对类型)与 API 交谈。
let ajaxsettings: JQueryAjaxSettings = {
url: this.url,
contentType: "application/json",
type: "POST",
data: JSON.stringify(this.apiRequest),
processData: false,
success: ( data, textStatus, jQxhr ) => {
console.log("Response:" + JSON.stringify(data));
},
error: ( jqXhr, textStatus, errorThrown ) => {
console.log("Error Response; " + JSON.stringify(jqXhr));
},
headers: {
"X-UserName": "blahblah",
"X-Password": "blahblah"
},
beforeSend: (request) => {
request.setRequestHeader("X-APIKey", "blahblahblah");
}
};
$.ajax(ajaxsettings);
发出请求并查看 Fiddler 捕获的内容相当奇怪。
错误的 HTTP 动词,并且标头包含在 Access-Control-Request-Headers 中,而不是作为标准标头。
JQuery 3.2.0,以及来自Definitely Typed的最新index.d.ts。
我可以在 Fiddler 中创建一个 HTTP 请求:
我正在尝试创建的请求:
更新
我尝试过使用数据类型来绕过preflight checks:
contentType : "text/plain",
method: "POST",
type: "post",
dataType: "json",
更新 2
API 托管在 Visual Studio 2017 的 IIS Express 中(使用 .NET Core),网站使用 lite-server 托管。取出自定义标头时,此代码工作正常。
【问题讨论】:
-
这只是一个疯狂的猜测,但根据 jQury API 文档,您应该在 1.9 之前使用
method来支持type。 -
谢谢,我已将 type: 更改为 data: 但它仍然以 OPTIONS 而不是 POST 的形式出现
-
您能否创建一个最小示例,以便我们测试您的代码? :)
-
我明白了,但是浏览器具有 .NET(或任何其他类型的)HTTP 客户端所没有的限制。您可以为非浏览器客户端保留该服务,并拥有另一个“代理/中继”服务,通过将来自浏览器的请求(包括 CORS 所需的一切)中继到真正的后端服务,以浏览器友好的方式公开它。
标签: jquery typescript typescript2.3