使用JSON正文

时间:2016-02-23 10:58:20

标签: json rest http angular

我正在使用POSTMAN发出一些POST请求,如下所示:

enter image description here

这是使用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

请求的详细信息以及开发工具的响应如下:

enter image description here

我不知道如何处理这个问题。

4 个答案:

答案 0 :(得分:1)

出于某种原因,没有提供OPTIONS请求。我使用了以下工具:

https://github.com/jdesrosiers/silex-cors-provider

现在工作正常。

答案 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错误的原因......