Aurelia Post 使用 http-fetch-client 生成选项请求
Aurelia Post with http-fetch-client producing an options request
我正在创建一个小型论坛,我们公司的员工可以使用 aurelia 为他们想即时销售的商品或服务发布广告。我有一个广告页面列表工作正常,每个广告的详细信息页面都工作正常,都使用来自 api 的获取请求。但是,当有人想在广告上添加评论时,我似乎无法完成 Post 要求的工作。
@inject(HttpClient)
export class ApiData {
constructor(httpClient) {
httpClient.configure(config => {
config
.withBaseUrl("MyUrl");
});
this.http = httpClient;
//.configure(x => {x.withHeader('Content-Type', 'application/json');});
}
postAdvertComment(comment, id) {
return this.http.fetch(`/adverts/${id}/comments`, {
method: "post",
body: json(comment),
headers: {
'Accept': 'application/json'
}
});
}
getAdverts() {
return this.http.fetch("/adverts")
.then(response => {
return this.adverts = response.json();
});
}
getAdvert(id) {
return this.http.fetch(`/adverts/${id}`)
.then(response => {
return this.advert = response.json();
});
}
}
在做这个项目时我们遇到了一些 CORS 问题,所有问题都通过在 api 中添加 AllowCors 标签解决,包括所有方法等
<add key="CorsAllowedOrigins" value="*" />
<add key="CorsAllowedHeaders" value="" />
<add key="CorsAllowedMethods" value="*" />
然而,当我尝试 运行 post 时,它 运行ning 一个选项方法和 returns 一个 400 Bad 请求。
Here
我们还收到以下 CORS 错误:
Fetch API cannot load MyURL/api/adverts/2/comments. Response to preflight
request doesn't pass access control check: No 'Access-Control-Allow-Origin'
header is present on the requested resource. Origin 'http://localhost:49877' is
therefore not allowed access. The response had HTTP status code 400. If an
opaque response serves your needs, set the request's mode to 'no-cors' to fetch
the resource with CORS disabled.
我不知道这是否是我们的 c# api 或我尝试从 aurelia post 的方式的问题,但我们已尝试从 post 发送请求man,它工作正常,尝试使用 jquery 在同一个应用程序中发送 post 请求,它工作正常,所有的 get 请求都工作正常,但由于某种原因,这个 post 导致所有各种问题。
这似乎是您的 WebAPI 中的问题,但在为您提供一些可能的解决方案之前,我想向您展示一些重要的事情。
- Postman 不受 CORS 影响,所以所有请求都有效。
- jQuery ajax 使用 XHR (
XmlHttpRequest
object) 而 aurelia-fetch-client
使用 fetch (window.fetch
。但是,fetch-polyfill 在后台使用 XHR)。他们是
解决同一个问题的不同方法。仅仅因为其中一个有效,并不意味着另一个也应该有效。
- OPTIONS 请求是由fetch 发出的,这就是它的工作原理。此处有更多信息 https://developers.google.com/web/updates/2015/03/introduction-to-fetch?hl=en
要解决此问题,请尝试从 web.config 中删除这些标签,并在您的 Startup.cs
中允许 CORS。像这样:
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll); //or another parameter
//rest of your code
}
您不必将 content-type header 设置为 application/json。当你使用 json()
函数时它会自动生成 ---> body: json(comment)
如果您使用的是 OWIN,则可能需要将 content-type 作为 x-www-form-urlenconded 发送。既然如此,看看这个Post 'x-www-form-urlencoded' content with aurelia-fetch-client
我正在创建一个小型论坛,我们公司的员工可以使用 aurelia 为他们想即时销售的商品或服务发布广告。我有一个广告页面列表工作正常,每个广告的详细信息页面都工作正常,都使用来自 api 的获取请求。但是,当有人想在广告上添加评论时,我似乎无法完成 Post 要求的工作。
@inject(HttpClient)
export class ApiData {
constructor(httpClient) {
httpClient.configure(config => {
config
.withBaseUrl("MyUrl");
});
this.http = httpClient;
//.configure(x => {x.withHeader('Content-Type', 'application/json');});
}
postAdvertComment(comment, id) {
return this.http.fetch(`/adverts/${id}/comments`, {
method: "post",
body: json(comment),
headers: {
'Accept': 'application/json'
}
});
}
getAdverts() {
return this.http.fetch("/adverts")
.then(response => {
return this.adverts = response.json();
});
}
getAdvert(id) {
return this.http.fetch(`/adverts/${id}`)
.then(response => {
return this.advert = response.json();
});
}
}
在做这个项目时我们遇到了一些 CORS 问题,所有问题都通过在 api 中添加 AllowCors 标签解决,包括所有方法等
<add key="CorsAllowedOrigins" value="*" />
<add key="CorsAllowedHeaders" value="" />
<add key="CorsAllowedMethods" value="*" />
然而,当我尝试 运行 post 时,它 运行ning 一个选项方法和 returns 一个 400 Bad 请求。 Here
我们还收到以下 CORS 错误:
Fetch API cannot load MyURL/api/adverts/2/comments. Response to preflight
request doesn't pass access control check: No 'Access-Control-Allow-Origin'
header is present on the requested resource. Origin 'http://localhost:49877' is
therefore not allowed access. The response had HTTP status code 400. If an
opaque response serves your needs, set the request's mode to 'no-cors' to fetch
the resource with CORS disabled.
我不知道这是否是我们的 c# api 或我尝试从 aurelia post 的方式的问题,但我们已尝试从 post 发送请求man,它工作正常,尝试使用 jquery 在同一个应用程序中发送 post 请求,它工作正常,所有的 get 请求都工作正常,但由于某种原因,这个 post 导致所有各种问题。
这似乎是您的 WebAPI 中的问题,但在为您提供一些可能的解决方案之前,我想向您展示一些重要的事情。
- Postman 不受 CORS 影响,所以所有请求都有效。
- jQuery ajax 使用 XHR (
XmlHttpRequest
object) 而aurelia-fetch-client
使用 fetch (window.fetch
。但是,fetch-polyfill 在后台使用 XHR)。他们是 解决同一个问题的不同方法。仅仅因为其中一个有效,并不意味着另一个也应该有效。 - OPTIONS 请求是由fetch 发出的,这就是它的工作原理。此处有更多信息 https://developers.google.com/web/updates/2015/03/introduction-to-fetch?hl=en
要解决此问题,请尝试从 web.config 中删除这些标签,并在您的 Startup.cs
中允许 CORS。像这样:
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll); //or another parameter
//rest of your code
}
您不必将 content-type header 设置为 application/json。当你使用 json()
函数时它会自动生成 ---> body: json(comment)
如果您使用的是 OWIN,则可能需要将 content-type 作为 x-www-form-urlenconded 发送。既然如此,看看这个Post 'x-www-form-urlencoded' content with aurelia-fetch-client