gpt4 book ai didi

php - CORS header 不会在异常时随 Symfony 一起发送

转载 作者:搜寻专家 更新时间:2023-10-31 21:55:59 24 4
gpt4 key购买 nike

我正在使用流行的 FOSRestBundle 在 Symfony 中开发一个 RESTful API。 API 已经差不多完成了,但它仍然不支持跨域调用。

我已经尝试添加 NelmioCorsBundle,但未能使其正常工作。我已经开始测试不同的东西,比如添加

headers('Access-Control-Allow-Origin', '*');

手 Action 为我的 app_dev.php 中的第一行代码。我知道这可能不是添加它的最佳位置,但我只是想知道它是否真的在做任何事情。

现在有趣的部分来了:

当我只发送 GET 请求时,会添加 header 。当我发送一个成功 POST 请求时,还会添加 header ,并且我会收到一个 AJAX 调用可以读取的响应。但是,当 API 突然抛出异常时,CORS header 未添加到响应中,因此我的浏览器拒绝加载响应。我不知道这是否是正常行为,但由于我的 API 对几乎所有内容都抛出异常(缺少参数或格式错误的参数,......)这使得我的 API 在使用 AJAX 调用时毫无用处?

我已经设置了一个合适的监听器来提供这些 header :

namespace MyComp\MyBundle\Listeners;

use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

class CorsListener
{
public function onKernelResponse(FilterResponseEvent $event)
{
$responseHeaders = $event->getResponse()->headers;

$responseHeaders->set('Access-Control-Allow-Headers', 'origin, content-type, accept');
$responseHeaders->set('Access-Control-Allow-Origin', '*');
$responseHeaders->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, PATCH, OPTIONS');
}
}

并将其注册到我的services.yml 文件中:

MyCompMyBundle.cors.listener:
class: MyComp\MyBundle\Listeners\CorsListener
tags:
- { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }

添加时

die("---");

在 CorsListener 中,当我尝试发出请求时它会正确输出此字符串。 API 是否抛出异常无关紧要,所以我确信每个请求都会调用此代码块。

例如:

API._post("access-tokens", undefined, {"email": "xxx@hotmail.com", "password": "xxx"}, function(e) { console.log(e) })

调用:

_post: function(endpoint, id, dataObject, completionHandler) {
var url = this._baseUrl + endpoint;
url = typeof id !== "undefined" ? url + "/" + id : url;

$.ajax({
url: url,
type: 'POST',
// this._encodeData converts the data object to a x-www-form-encoded string
data: this._encodeData(dataObject),
crossDomain: true,
success: function(data) {
completionHandler({"success": data});
},
error: function(e) {
completionHandler({"error": e});
}
});
}

返回带有以下 header 的响应:

Access-Control-Allow-Headers:origin, content-type, accept
Access-Control-Allow-Methods:POST, GET, PUT, DELETE, PATCH, OPTIONS
Access-Control-Allow-Origin:*
Cache-Control:no-cache
Connection:close
Content-Type:application/json
Host:127.0.0.1:8000
(left out some unimportant bits like date and php version)

如果我提供正确的电子邮件/密码组合。如果我输入垃圾或省略登录参数,API 应该抛出并返回此错误:

{
"code": 500,
"message": "Log in using either fb-id/access-token or email/password!"
}

然而,当 API 确实抛出此错误时,即使来自 CorsListener 的代码仍在被调用,我得到的唯一响应 header 是:

Connection → close
Content-type → text/html; charset=UTF-8
Host → 127.0.0.1:8000

这再次阻止了 AJAX 调用。

当我在 Postman 中使用垃圾或忘记的参数发送相同的请求时,它返回 a

500 Internal Server Error

使用正确的标题

Access-Control-Allow-Headers → origin, content-type, accept
Access-Control-Allow-Methods → POST, GET, PUT, DELETE, PATCH, OPTIONS
Access-Control-Allow-Origin → *
Cache-Control → no-cache
Etc...

和内容

{
"code": 500,
"message": "Log in using either fb-id/access-token or email/password!"
}

为什么我的服务器不像处理 Postman 那样处理 AJAX 调用?我读过 Postman 不发送 Origin header ,但我认为这不会有这么大的不同吗?

我做错了什么吗?或者我只是想实现一些不可能的事情?如果是这样,处理我的情况的正确方法是什么?我不仅试图解决我的问题,我还试图理解根源是什么,以便我可以从中学习

最佳答案

在我清除 Symfony 缓存文件夹后,这些问题自行解决。

关于php - CORS header 不会在异常时随 Symfony 一起发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33721442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com