我正在使用POSTMAN发出一些POST请求,如下所示:
这是使用POSTMAN,它工作得很好。以下也是来自POSTMAN
POST /supervisor/stop/process HTTP/1.1
Host: bento
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 66b05631-8b4e-473a-9d3f-deaa544ecac6
{
"ip" : "192.168.1.115",
"port" : "9001",
"process" : "public_video_convert:video_convert_01"
}
我使用Angular 2尝试了同样的事情如下:
let url = "http://bento/supervisor/stop/process";
let data = {
"ip": "192.168.1.115",
"port": "9001",
"process": "public_video_convert:video_convert_01"
}
let body = JSON.stringify(data);
let head = new Headers({
'Content-Type': 'application/json'
});
this.http.post(url, body, {headers : head})
.map(res => res.json())
.subscribe(
data => {console.log(data);},
err => console.log(err),
() => console.log('Fetching complete for Server Metrics')
);
当我运行时,我得到405 Method Not Allowed
请求的详细信息以及开发工具的响应如下:
我不知道如何处理这个问题。
答案 0 :(得分:1)
答案 1 :(得分:1)
你从服务器获得405,因为它不知道如何处理" OPTIONS"请求(因此"方法不允许"响应)。
这是"预检"如果您要发送"非简单"请求从浏览器发送请求到不同的域(在这种情况下,您的网页由evil.com托管并尝试发送xhr到bento)。对于你的例子,是什么使你的请求"不简单"是标题"内容类型":" application / json"。
当您的网络应用发出跨域请求时会发生这种情况。一般来说,有两种情况:
您要么发送"简单"请求,在这种情况下,浏览器直接发送它(使用Origin Header),或者,您正在发送" not Simple"请求,在这种情况下,浏览器首先向服务器发送预检请求(OPTIONS)以确认原点是否在" Access-Control-Allow-Origin"中列出,然后发出实际请求。
有关跨源资源共享的更多详细信息,请访问:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
答案 2 :(得分:0)
目前Angulars Http
仅支持文字。有计划支持其他身体类型https://github.com/angular/http/issues/75
答案 3 :(得分:0)
我认为您忘记导入public bool ProcessSelectionChangedOnServer { get; set; }
类:
Headers
在这种情况下,您的自定义标头不会添加到请求中。我无法在请求的详细信息和您提供的开发工具的响应中看到Content-Type标头。应根据您提供的代码在请求中发送此标头(导入除外)。
如果没有JSON内容类型,服务器似乎不支持POST方法。这就是你收到405错误的原因......