Closed wx1860 closed 3 years ago
看了源码有如下转换,里面没有涉及到Content-Type 为text/xml,不知道是否和这块有关 $request = new SymfonyRequest($get, $post, [], $cookie, $files, $server, $content);
if (0 === stripos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
&& in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH'))
) {
parse_str($request->getContent(), $data);
$data = array_merge($post, $data);
$request->request = new ParameterBag($data);
} elseif (0 === stripos($request->headers->get('CONTENT_TYPE'), 'application/json')) {
$data = array_merge($post, json_decode($request->getContent(), true));
$request->request = new ParameterBag($data);
}
$this->illuminateRequest = IlluminateRequest::createFromBase($request);
file_get_contents( 'php://input' ) 是原生 php-fpm 获取 请求 body 的方式,并不适用于 swoole。这块建议你阅读 swoole 的官方文档学习一下。
按照你的需求,可以通过 $request->getContent()
获取 xml,自己写一个 xml 解析器解析就可以了。
看了源码有如下转换,里面没有涉及到Content-Type 为text/xml,不知道是否和这块有关 $request = new SymfonyRequest($get, $post, [], $cookie, $files, $server, $content);
if (0 === stripos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded') && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH')) ) { parse_str($request->getContent(), $data); $data = array_merge($post, $data); $request->request = new ParameterBag($data); } elseif (0 === stripos($request->headers->get('CONTENT_TYPE'), 'application/json')) { $data = array_merge($post, json_decode($request->getContent(), true)); $request->request = new ParameterBag($data); } $this->illuminateRequest = IlluminateRequest::createFromBase($request);
你可以研究下 Laravel 本身有没有转换 xml 或者 json,如果没有的话那说明不是框架必须的功能。你可以根据需要,自行根据 content-type 把 body 转换成需要的格式。这里的 request 转换逻辑,参考了另外一个 Laravel 结合 Swoole 的项目。那个项目中也没有转换 xml 数据,猜测可能是因为 xml 规则比较复杂,不适合在底层框架实现。
以下三种只有第二种可以接收到数据 /**
@@return mixed */ public function notify(Request $request) { $xml = file_get_contents( 'php://input' ); log::debug('error:'.$xml); $xmls = $request->getContent(); log::debug('error:'.$xmls); $content = $content ?? Request::createFromGlobals()->getContent(); log::debug('error:'.$content); $data = Support::fromXml($xml); //$attach = json_encode($data['attach'],true);
} 看了laravel-tars的Request部分是将TarsRequest 转为 Illuminate\Http\Request,目前我自己如何能让Symfony\Component\HttpFoundation\Request也可以接收到数据,因为支付采用了yansongda\pay三方包,导致用Symfony\Component\HttpFoundation\Request不能接收到xml数据