Я пытаюсь создать пакет Laravel для расширения гибкости Http-клиента Laravel, и у меня возникают некоторые проблемы.
Проще говоря, я хотел бы изменить полезную нагрузку запросов POST / PUT / PATCH / DELETE. Я вижу, что класс является Macroable, поэтому я добавил несколько макросов поддержки для установки правильных заголовков, но когда дело доходит до преобразования массива в строку (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 и не заставив мой пакет make Laravel внедрить мой класс, который расширяет базовый класс, просто для изменения полезной нагрузки запроса? Я действительно не хочу этого делать, если это вообще возможно.
Есть ли способ преобразовать $this->bodyFormat
в xml перед отправкой запроса? Я знаю, что Guzzle будет учитывать строку xml в запросе в указанном формате, который класс PendingRequest
отправляет.