- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在下面的代码中,我希望 $request->getContents()
获取 HTTP
请求的正文内容。发送非多部分请求时,这按预期工作,但在使用多部分请求时,$body
变量保持为空。
public function postDebugAction(Request $request) {
$body = $request->getContent();
if (empty($body)) {
throw new \Exception('Body empty.');
}
return $this->view(array(), 201);
}
看完this问答 我还添加了一个 body 监听器。
<?php
namespace VSmart\ApiBundle\Listener;
use FOS\RestBundle\EventListener\BodyListener as BaseBodyListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use FOS\RestBundle\Decoder\DecoderProviderInterface;
class BodyListener extends BaseBodyListener {
/**
* @var DecoderProviderInterface
*/
private $decoderProvider;
/**
* @param DecoderProviderInterface $decoderProvider Provider for fetching decoders
*/
public function __construct(DecoderProviderInterface $decoderProvider) {
$this->decoderProvider = $decoderProvider;
}
/**
* {@inheritdoc}
*/
public function onKernelRequest(GetResponseEvent $event) {
$request = $event->getRequest();
if (strpos($request->headers->get('Content-Type'), 'multipart/form-data') !== 0) {
return;
}
$format = 'json';
if (!$this->decoderProvider->supports($format)) {
return;
}
$decoder = $this->decoderProvider->getDecoder($format);
$iterator = $request->request->getIterator();
$request->request->set($iterator->key(), $decoder->decode($iterator->current(), $format));
}
}
根据我的 PHPUnit 测试,这在使用 Postman
和 Advanced Rest Client
模拟请求时仍然有效,主体似乎再次为空。我仔细检查了这个以使用调试器将模拟请求作为 PHPUnit 运行。结果是,实际上,当通过 Rest 客户端模拟时,正文是空的,而当通过 PHPUnit 运行时,正文不是空的。
我使用的测试用例:
发布网址:
http://localhost/EntisServer/web/app_dev.php/api2/debug
标题:
Authorization: Bearer ZGYzYjY1YzY4MGY3YWM3OTFhYTI4Njk3ZmI0NmNmOWZmMjg5MDFkYzJmOWZkOWE4ZTkyYTRmMGM4NTE1MWM0Nw
Content-Type: multipart/form-data; boundary=-----XXXXX
内容:
-----XXXXX
Content-Disposition: form-data; name="json"
Content-Type: application/json; charset=utf-8
{
"blabla": 11
}
-----XXXXX
Content-Disposition: form-data; name="q_3101"; filename="image.jpg"
Content-Type: image/jpeg
contents of a file...
-----XXXXX--
更新我不确定我是否在不使用 BodyListener
的情况下单步执行了调试器。当我这样做时,结果是完全一样的。因此,在没有 BodyListener
的情况下,PHPUnit 案例会获取主体,尽管模拟请求仍然是空的。
最佳答案
请参阅 php.net 上的 php://
包装器:
Note: Prior to PHP 5.6, a stream opened with php://input could only be read once; the stream did not support seek operations. However, depending on the SAPI implementation, it may be possible to open another php://input stream and restart reading. This is only possible if the request body data has been saved. Typically, this is the case for POST requests, but not other request methods, such as PUT or PROPFIND.
因此请更新您的 PHP 版本或确保您只读取一次输入。
关于php - 多部分请求时 Fosrestbundle 主体为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28781823/
我正在尝试构建 symfony2 rest api,但我正在为 FOSRestBundle 苦苦挣扎 起初我可以制作“@View()”注释,因为它总是会说我的模板丢失,无论我使用什么配置选项我都会得到
对于使用 FOSRestBundle 的 Web 服务,我创建了一个防火墙来强制登录以访问应用程序。 我的问题是,当我通过 ajax 调用 API 时,我需要在用户未通过身份验证时获取错误代码 401
我可以使用@QueryParam()批注获取GET参数,但是看起来它仅适用于查询字符串数据:/user?id=123。 我宁愿像/user/123一样使用它。为此,我可能会使用@Get("/user/
我正在使用FOSRestBundle。我想返回用户信息,但数据信息较少......如何做到这一点?这是我当前的回复 { "id": 1, "user": { "id":
我正在尝试使用 Symfony2 和 FOSRestBundle 来构建 REST 框架,但失败得很惨。 我已完成以下操作: 在我的 deps 文件中: [FOSRest] git=git:/
我正在尝试在 FOSRestBundle 中添加自定义异常控件,但它似乎忽略了我的自定义消息(响应的状态代码正常)。 我有: throw new HttpException(404, "User {$
我使用 Symfony2.2 和 FOSRestBundle 我设置 #app/config/config/yml myapp_rest: resource: "@MyappRestBundl
我正在寻找一个简单、愚蠢的解决方案来强制所有symfony2 的content-type 到application/json fosrestbundle 中的 http 错误消息(如 MethodNo
上下文 我发现了很多关于使用 FOSRest 进行部分 API 响应的问题,所有答案都基于 JMS 序列化程序选项(排除、包含、组等)。它工作正常,但我尝试实现一些不那么“静态”的东西。 假设我有一个
我正在尝试将 FOSRestBundle 集成到我的应用程序中。 我只想在路由匹配时使用它,如 ^/api。 我真的不知道如何使用这个包,而且我认为文档非常糟糕。 (无意冒犯)。 fos_rest:
我在使用 FOSRestBundle 时遇到错误。 Fatal error: Class 'JMS\Serializer\SerializationContext' not found in /hom
我的 fos_rest 部分的配置: fos_rest: serializer: serialize_null: true view: view_res
有人可以清楚地解释应该如何使用 FOSRest 为 REST 请求配置路由吗?每个教程似乎都有不同的做法。 我的 Controller : all(); // returns arra
我是 Symfony (5.3) 的新手,想扩展 RequestBodyParamConverter (FOSRestBundle 3.0.5) 创建一个 REST api。使用 @ParamConv
我正在使用 Symfony2 和 FosRestBundle 为我们的系统开发一个 REST API。FosRestBundle 是一个非常好的工具,但它似乎有一个限制:只有属性(priviate、p
我正在尝试让我的 Controller 与参数 getter 一起工作。我做了文档中指定的所有说明。所以我有:配置fos_rest.yml: fos_rest: param_fetcher_lis
这是我的配置文件: // app/config/config.yml fos_rest: body_listener: array_normalizer: fos_rest.n
config.yml: twig: debug: %kernel.debug% strict_variables: %kernel.debug% exce
我有一个 symfony 应用程序,它提供 RESTful API(用于移动应用程序)并具有后端管理。 我可以通过facebook成功登录后端,但是我应该如何允许通过RESTful API登录? 最佳
我正在使用 symphony a fosrestbundle 开发一个 api。我还想在我的 Controller 中使用构造函数注入(inject),就像我总是注入(inject)一些 Entity
我是一名优秀的程序员,十分优秀!