Angular 2 帖子 : Not sending 'content-type: application/json' to server

标签 angular post content-type

我真的很难处理 Angular 2 中的 POST 请求。我可以发送带有某些参数的请求,但我的后端(PHP Slim v3)无法获取参数。因此,我调查了我的请求,并意识到我的 Angular 请求发送了“内容类型:application/text-plain”。因此我的后端无法访问变量。

然后,我阅读了很多教程,浏览了堆栈溢出,并得出结论,我必须附加 header 。

我的 Angular 类如下所示:

/**
* Generic method for all POST-requests.
* 
* @author 
* @date 08.01.2017
*/
postData(apiUrl, data): any
{

    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers });
    let body = JSON.stringify(data)

    return this.http.post(apiUrl, body, options)
        .map((responseData) => 
        {
            if(responseData.status === 200)
            {
                return this.extractData(responseData);
            }
            else
            {
                this.handleRestError(null); 
            }
        })
        .catch(res => {
            return this.handleRestError(res);
       });
}

总而言之,非常简单。然而,当我发送该请求时,奇怪的是,它以某种方式将其识别为 OPTIONS 请求并给我“不受支持的方法:OPTIONS”。

请在此处查看请求 header :

OPTIONS /auth/new HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: http://localhost:8100
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Access-Control-Request-Headers: content-type
Accept: */*
Referer: http://localhost:8100/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4

我来自后端的响应如下所示:

HTTP/1.1 200 OK
Host: localhost:8080
Connection: close
X-Powered-By: PHP/5.6.28
Set-Cookie: PHPSESSID=aa546thl9maj7hamjj64vpbe95; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-type: text/plain;charset=UTF-8
Allow: POST
Access-Control-Allow-Methods: OPTIONS
Content-Length: 21

服务器的响应如下所示:

Allowed methods: POST

但是,我成功地从服务器获得了正确的响应,并省略了发布请求中的 options 参数。然后请求会被正确发送,我会在 Chrome 控制台的请求负载中看到所需的参数。问题是我无法访问后端的变量,因为它不断给我一个“内容类型:text/plain”。

知道我做错了什么吗?

提前感谢您的帮助!

最佳答案

这是因为你面临 CORS 问题,所以你也需要允许 OPTIONS 方法(后端)。像这样的东西:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type
Access-Control-Max-Age: 86400

在此处了解有关 CORS 的更多信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

关于 Angular 2 帖子 : Not sending 'content-type: application/json' to server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41987044/

相关文章:

javascript - Angular 2 快速入门演示不起作用

javascript - 以 Angular 形式显示订阅响应值

json - 如何在plsql中以json形式发送POST请求

javascript - 某些带括号的字符串会导致 Ajax POST 操作失败并出现 403 错误(禁止)

ruby-on-rails-3 - Rails 内容类型验证不适用于 Paperclip

python-3.x - Tornado:stream_request_body 输出的 mime 类型

dart - Angular 2 Dart : RouteParams not working until refresh

angular - 在浏览器的输入中检测 Ctrl + C 和 Ctrl + V

ssl - 使用 SSL 生成 HTTP 错误 400。请求 URL 无效

view - Plone 4 中的自定义编辑 View