luoxiaojun1992 / laravel-tars

Tars driver for laravel.
Apache License 2.0
28 stars 9 forks source link

请教一下关于request接收的方式 #26

Closed wx1860 closed 3 years ago

wx1860 commented 3 years ago

以下三种只有第二种可以接收到数据 /**

wx1860 commented 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);
luoxiaojun1992 commented 3 years ago

file_get_contents( 'php://input' ) 是原生 php-fpm 获取 请求 body 的方式,并不适用于 swoole。这块建议你阅读 swoole 的官方文档学习一下。

按照你的需求,可以通过 $request->getContent() 获取 xml,自己写一个 xml 解析器解析就可以了。

luoxiaojun1992 commented 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);

你可以研究下 Laravel 本身有没有转换 xml 或者 json,如果没有的话那说明不是框架必须的功能。你可以根据需要,自行根据 content-type 把 body 转换成需要的格式。这里的 request 转换逻辑,参考了另外一个 Laravel 结合 Swoole 的项目。那个项目中也没有转换 xml 数据,猜测可能是因为 xml 规则比较复杂,不适合在底层框架实现。