简体   繁体   中英

Guzzle PUT request auth error

I have the following code to save content using API from another system. I have added the credentials but it showing wrong credentials error. It is working perfectly in postman.

    $client = new GuzzleHttpClient();
try {
  $request = new \GuzzleHttp\Psr7\Request('PUT', config('cms.api.backend') .'/products/'. $nid,
    [
      'auth' => [config('cms.api.user'), config('cms.api.password')],
      'form_params' => [
        'copywrite' => Input::get('copywrite'),
        'status' => $status
      ],
  ]);
  $promise = $client->sendAsync($request)->then(function ($response) {});
  $promise->wait();
}
catch (RequestException $e) {
  $this->logHttpError($e->getResponse()->getStatusCode(), $e->getResponse()->getBody(true));
}

What could be wrong in the above code?

Following is the exported code from postman.

$request = new HttpRequest();
$request->setUrl('http://mybackend/api/products/74371');
$request->setMethod(HTTP_METH_PUT);

$request->setHeaders(array(
  'postman-token' => 'e0ddcaea-4787-b2c5-0c52-9aaee860ceac',
  'cache-control' => 'no-cache',
  'authorization' => 'Basic authenticationcode',
  'content-type' => 'application/x-www-form-urlencoded'
));

$request->setContentType('application/x-www-form-urlencoded');
$request->setPostFields(array(
  'copywrite' => 'date to be saved'
));

try {
  $response = $request->send();

  echo $response->getBody();
} catch (HttpException $ex) {
  echo $ex;
}

Third argument in \\GuzzleHttp\\Psr7\\Request is for headers array only, so you won't send request body (4th arg) this way. Easiest way would be passing this array as second argument to sendAsync() method. It will recognise them and form_params option will be parsed as Content-Type: application/x-www-form-urlencoded header and create a valid stream for your request (it uses http_build_query() function if you want to do it directly in request constructor):

$request = new \GuzzleHttp\Psr7\Request('PUT', config('cms.api.backend') .'/products/'. $nid);
$options = [
    'auth' => [config('cms.api.user'), config('cms.api.password')],
    'form_params' => [
        'copywrite' => Input::get('copywrite'),
        'status' => $status
    ],
];


$promise = $client->sendAsync($request, $options)->then(function ($response) {});
$promise->wait();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM