Javascript POST请求在凤凰城转向200个选项,但不发送以下帖子
我正在使用Angular 2和Phoenix,我正在尝试向Phoenix发送POST请求。我有以下代码: endpoint.ex 在我的前端我有Javascript POST请求在凤凰城转向200个选项,但不发送以下帖子,javascript,angular,cors,elixir,phoenix-framework,Javascript,Angular,Cors,Elixir,Phoenix Framework,我正在使用Angular 2和Phoenix,我正在尝试向Phoenix发送POST请求。我有以下代码: endpoint.ex 在我的前端我有 @Injectable() export class RegisterService { public headers: Headers; constructor(private _http: Http) { this.headers = new Headers(); this.headers.app
@Injectable()
export class RegisterService {
public headers: Headers;
constructor(private _http: Http) {
this.headers = new Headers();
this.headers.append('Content-Type', 'application/json');
}
createUser(): Observable<Response> {
return this._http.post(
'http://localhost:4000/v1/users',
JSON.stringify({
firstName: 'lll',
lastName: 'xxxxx',
email: 'dddd@gmail.com',
password: 'test123'
}),
{headers: this.headers}
);
}
}
我有200个OK选项,但它从不发送POST请求
全体的
响应头
请求头
我的凤凰社日志上写着
[info] OPTIONS /v1/users
[info] Sent 200 in 31µs
不知道我做错了什么。我确实稍微修改了我的router.ex。。。虽然不确定这是否会有什么不同,但它在这里
defmodule Api.Router do
use Api.Web, :router
pipeline :api do
plug :accepts, ["json"]
end
scope "/", Api do
pipe_through :api
resources "/organizations", OrganizationController
end
scope "/v1", Api.V1, as: :v1 do
pipe_through :api
resources "/users", UserController, only: [:create, :show, :update]
end
end
您需要配置http://localhost:4000/v1/users 发送响应的路由,该响应包括Access Control Allow Origin响应标头,还包括Access Control Allow Headers响应标头,该标头的值中包含字符串内容类型,访问控制Allow Methods响应头的值中包含字符串POST
详细解释
解释浏览器发送该选项请求的原因,以及浏览器对此需要什么响应
我有200个OK选项,但它从不发送POST请求
这是因为如果选项响应不包括具有上述值的Access Control Allow Origin标头、Access Control Allow标头和Access Control Allow Methods标头,然后浏览器就停在那里,永远不会发送帖子。您需要配置http://localhost:4000/v1/users 发送响应的路由,该响应包括Access Control Allow Origin响应标头,还包括Access Control Allow Headers响应标头,该标头的值中包含字符串内容类型,访问控制Allow Methods响应头的值中包含字符串POST
详细解释
解释浏览器发送该选项请求的原因,以及浏览器对此需要什么响应
我有200个OK选项,但它从不发送POST请求
这是因为,如果选项响应不包括具有如上所述值的Access Control Allow Origin标头、Access Control Allow标头和Access Control Allow Methods标头,则浏览器将立即停止并从不发送帖子。原始值与原始标头完全匹配。您的请求正在发送原始值http://localhost:4200 而你只允许http://localhost. 您需要将原点更改为http://localhost:4200 如果要允许来自的请求http://localhost:4200:
原点值与原点标头完全匹配。您的请求正在发送原始值http://localhost:4200 而你只允许http://localhost. 您需要将原点更改为http://localhost:4200 如果要允许来自的请求http://localhost:4200:
您正在订阅createUser方法。用组件代码更新帖子。@Aravind更新了,是的,我正在打电话订阅。plug Corsica在plug MyApp.Router上面吗?你能试着暂时把原点改成*看看能不能解决这个问题?@Dogbert是的,插头科西嘉在插头上方,我把它改成*了,它似乎起作用了。。。现在正在发送POST请求!!!!不过,在这一点上,为什么当我使用chrome开发工具时,我会同时看到选项和POST请求?我以前从未见过。你能试试起源吗:http://localhost:4200 还有一次吗?它有效吗?您是否订阅createUser方法。用组件代码更新帖子。@Aravind更新了,是的,我正在打电话订阅。plug Corsica在plug MyApp.Router上面吗?你能试着暂时把原点改成*看看能不能解决这个问题?@Dogbert是的,插头科西嘉在插头上方,我把它改成*了,它似乎起作用了。。。现在正在发送POST请求!!!!不过,在这一点上,为什么当我使用chrome开发工具时,我会同时看到选项和POST请求?我以前从未见过。你能试试起源吗:http://localhost:4200 还有一次吗?它有效吗?你知道为什么它还在发送200个选项的回复吗?但不是邮报?如果200个选项失败,我会觉得更合理。@LukeXu@sideshowbarker在他们的答案末尾解释得比我好得多你知道为什么它还在发送200个选项的回复吗?但不是邮报?如果200个选项失败,我会觉得更合理。@LukeXu@sideshowbarker在他们的答案末尾解释得比我好得多
Request URL:http://localhost:4000/v1/users
Request Method:OPTIONS
Status Code:200 OK
Remote Address:127.0.0.1:4000
Referrer Policy:no-referrer-when-downgrade
cache-control:max-age=0, private, must-revalidate
content-length:0
date:Sat, 10 Jun 2017 04:29:50 GMT
server:Cowboy
x-request-id:hfm969svbqv9oa2jatn5ri641srsht3s
Accept:*/*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:localhost:4000
Origin:http://localhost:4200
Referer:http://localhost:4200/signup
[info] OPTIONS /v1/users
[info] Sent 200 in 31µs
defmodule Api.Router do
use Api.Web, :router
pipeline :api do
plug :accepts, ["json"]
end
scope "/", Api do
pipe_through :api
resources "/organizations", OrganizationController
end
scope "/v1", Api.V1, as: :v1 do
pipe_through :api
resources "/users", UserController, only: [:create, :show, :update]
end
end
plug Corsica, origins: "http://localhost:4200", allow_headers: ["content-type"]