Xml 在Laravel'中直接修改PendingRequest类的有效负载;什么是Http客户端?

Xml 在Laravel'中直接修改PendingRequest类的有效负载;什么是Http客户端?,xml,laravel,api,http,guzzle,Xml,Laravel,Api,Http,Guzzle,我试图构建一个Laravel包来扩展Laravel的Http客户端的灵活性,但我遇到了一些麻烦 很简单,我想修改POST/PUT/PATCH/DELETE请求的有效负载。我看到这个类是可宏的,所以我添加了一些支持宏来设置正确的头,但是当涉及到将数组转换为字符串(XML)时,我不知道如何截获有效负载。以下是我正在编写的代码示例: /** * Bootstrap Illuminate\Http\Client\PendingRequest with xml methods. * */ publi

我试图构建一个Laravel包来扩展Laravel的Http客户端的灵活性,但我遇到了一些麻烦

很简单,我想修改POST/PUT/PATCH/DELETE请求的有效负载。我看到这个类是可宏的,所以我添加了一些支持宏来设置正确的头,但是当涉及到将数组转换为字符串(XML)时,我不知道如何截获有效负载。以下是我正在编写的代码示例:

/**
 * Bootstrap Illuminate\Http\Client\PendingRequest with xml methods.
 *
 */
public function registerRequestMacros(): void
{
    $rootElement = 'request';

    PendingRequest::macro('acceptXml', function () {
        return $this->accept('application/xml');
    });

    PendingRequest::macro('convertDataToXml', function () use ($rootElement) {
        // Transform the data to xml if it is an array
        $this->beforeSending(function (\Illuminate\Http\Client\Request $request, array $options) use ($rootElement) {
            if (is_array($options[$this->bodyFormat]) && !empty($options[$this->bodyFormat])) {
                $options[$this->bodyFormat] = ArrayToXml::convert($options[$this->bodyFormat], $rootElement);
            }
        });
    });

    PendingRequest::macro('asXml', function () {
        $this->convertDataToXml();
        return $this->bodyFormat('xml')->contentType('application/xml');
    });
}
您可以看到,我正在尝试使用
beforeSending()
方法,乍一看,它似乎在将数组更改为有效的XML,但当我运行实际的类时,它没有更改任何内容。不必创建我自己的PendingRequest类,也不必让我的包让Laravel注入我的类(它扩展了基类),就可以更改请求负载吗?如果可能的话,我真的不想那样做


在发送请求之前,是否有方法将
$this->bodyFormat
转换为xml?我知道Guzzle将以
PendingRequest
类发送的给定格式尊重请求中的xml字符串。

我知道您在尝试做什么。不幸的是,似乎还没有一个干净的方法来实现这一点。我认为Laravel的HTTP客户机API存在缺陷,但由于它更新了,所以我想这个用例会从框架中得到支持。当执行
beforeSending()
回调时,Laravel已经将
$options
复制到一个包装好的Guzzle请求对象中,因此请求主体实际上不受用户可访问API中任何可用范围的影响。一个
postXml()
宏现在是可行的,但是它不太适合其他客户的风格。我看看你想做什么。不幸的是,似乎还没有一个干净的方法来实现这一点。我认为Laravel的HTTP客户机API存在缺陷,但由于它更新了,所以我想这个用例会从框架中得到支持。当执行
beforeSending()
回调时,Laravel已经将
$options
复制到一个包装好的Guzzle请求对象中,因此请求主体实际上不受用户可访问API中任何可用范围的影响。
postXml()
宏现在是可行的,但它不太适合客户端其他部分的样式