Отправить тело как необработанное с помощью Guzzle

Я пытаюсь использовать Guzzle для отправки запроса POST в свой веб-сервис. этот сервис принимает тело как необработанное. Он отлично работает, когда я использую почтальон, но я не использую Guzzle. при использовании Guzzle я получаю только описание веб-службы, когда помещаю URL-адрес веб-службы в браузер. вот мой код:

    $body = "CA::Read:PackageItems  (CustomerId='xxxxxx',AllPackages=TRUE);";
    $headers = [
        ....
        ....

    ]; 
$client = new Client();
$response = $client->request('POST', 'http://172.19.34.67:9882/TisService',$headers,$body);
echo $body = $response->getBody();

кажется, что заголовки или тело не проходят.


person Fshamri    schedule 07.08.2018    source источник


Ответы (3)


Попробуйте вот так

$response = $client->request('POST', 'http://172.19.34.67:9882/TisService',['headers' => $headers, 'body' => $body]);
person gbar    schedule 07.08.2018
comment
попробуйте этот ответы не имеют большого значения в Stackoverflow, потому что они мало что делают для обучения / расширения возможностей тысяч будущих исследователей. - person mickmackusa; 13.12.2018
comment
Но это лучше, чем ничего - person Chicna; 11.10.2019

Недавно мне пришлось впервые реализовать Guzzle, и это довольно простая в использовании библиотека.

Сначала я создал нового клиента

// Passed in our options with just our base_uri in
$client = new Client(["base_uri" => "http://example.com"]);

Затем я создал POST запрос, хотя я не использую new Request вместо $client->request(.... Это не имеет особого значения, хотя я использовал new Request.

// Create a simple request object of type 'POST' with our remaining URI
// our headers and the body of our request.
$request = new Request('POST', '/api/v1/user/', $this->_headers, $this->body);

так, по сути, это выглядело бы так:

$request = new Request('POST', '/api/v1/user/', ['Content-Type' => "application/json, 'Accept' => "application/json], '{"username": "myuser"}');

$this->headers - это простой массив пар ключ-значение наших заголовков запросов, в котором обязательно установлен заголовок Content-Type, а $this->body - простой строковый объект, в моем случае он формирует тело JSON.

Затем я могу просто вызвать метод $client->send(..., чтобы отправить запрос, например:

// send would return us our ResponseInterface object as long as an exception wasn't thrown.
$rawResponse = $client->send($request, $this->_options);

$this->_options - это простой массив пар ключ-значение, опять же простой для массива headers, но он включает такие вещи, как timeout для запроса.

Для меня я создал простой Factory объект с именем HttpClient, который создает для меня весь Guzzle запрос, поэтому я просто создаю новый Request объект вместо вызова $client->request(..., который также отправит запрос.

person Popeye    schedule 07.08.2018

Что вам нужно сделать, чтобы отправить данные как сырые, так это json_encode массив вашего $data и отправить его в запросе body.

$request = new Request(
    'POST',
    $url,
    ['Content-Type' => 'application/json', 'Accept' => 'application/json'],
    \GuzzleHttp\json_encode($data)
);

$response = $client->send($request);
$content = $response->getBody()->getContents();

Использование Guzzle Request GuzzleHttp\Psr7\Request; и клиента GuzzleHttp\Client

person Salam    schedule 13.08.2020