Http-клиент Laravel 7 + xml = неверный запрос, хотя curl работает нормально

У SO есть много вопросов для случаев, когда пользователь получает желаемый результат с помощью curl, но не с помощью php Guzzle http. В моем случае я пытаюсь использовать новый Httpclient laravel 7 (по сути, обертку вокруг Guzzle) следующим образом:

$xml= '<root></root>';
$url = 'http://10.0.0.2/rcp';
$req = Http::withHeaders([
        'Content-Type' => 'application/xml',
        'Accept' => 'application/xml',
        'user-agent' => 'Curl 7',
])
        ->withBasicAuth('user', 'secret')
        ->bodyFormat('xml')
        ->withOptions([
                'body' => $xml,
                'debug' => true,
        ])
        ->contentType('application/xml');
$req->post($url);

Это дает мне 400 ответов.

С завитком я сделал:

curl http://10.0.0.2/rcp -X POST -u "user:secret" -H "Content-Type: application/xml" -H "Accept: application/xml" --data '<root></root>'

Я попытался перехватить мои запросы и проверить их: они кажутся идентичными. Тем не менее, должно быть что-то не так в том, как я устанавливаю тело для Http, так как я продолжаю получать 400. Любые идеи?

Пс. Я также пытался использовать простой Guzzle вместо Http, но результат тот же. Я также пытался использовать:

$req->send('POST', $url, ['body' => $xml]);

вместо установки тела в вызове withOptions, но безуспешно. Я даже добавил заголовок пользовательского агента, чтобы на 100% имитировать curl, но, конечно, это не помогло.

ОБНОВЛЕНИЕ:

Я заметил, что привязываюсь к ответу с помощью Http:

* Mark bundle as not supporting multiuse 

ОБНОВЛЕНИЕ 2:

Мне также удалось заставить запрос работать с помощью curl изнутри PHP следующим образом:

$xml= '<root></root>';
$url = 'http://10.0.0.2/rcp';
$username = 'user';
$password = 'secret';

$curl = curl_init();
curl_setopt_array($curl, [
        curlopt_verbose => 1,
        curlopt_url => $url,
        curlopt_userpwd => $username . ':' . $password,
        curlopt_timeout => 30,
        curlopt_http_version => curl_http_version_1_1,
        curlopt_customrequest => 'post',
        curlopt_postfields => $xml,
        curlopt_httpheader => [
                'content-type: application/xml',
                'accept: application/xml',
        ],
]);

$response = curl_exec($curl);



person jharme    schedule 05.06.2020    source источник


Ответы (1)


Удалось разобраться. Как ни странно, установка xml внутри опции form_params заставила конечную точку, которую я отправлял, принимать мои запросы:

$response = $req->post($url, ['form_params' => [$xml]]);
person jharme    schedule 15.06.2020