2017-01-17 1 views
3

J'ai le code suivant pour sauvegarder le contenu en utilisant l'API d'un autre système. J'ai ajouté les informations d'identification, mais il montre une erreur d'informations d'identification incorrecte. Cela fonctionne parfaitement chez le facteur.Erreur d'authentification de requête PUT de Guzzle

$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)); 
} 

Qu'est-ce qui pourrait ne pas fonctionner dans le code ci-dessus?

Voici le code exporté par le facteur.

$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; 
} 
+0

Pourriez-vous montrer que vous demande d'exemple ai envoyé avec succès avec un facteur (pas besoin de données exactes)? – shudder

+0

@shudder - J'ai ajouté à la question, veuillez vérifier – Unnikrishnan

Répondre

1

Troisième argument dans \GuzzleHttp\Psr7\Request est pour le tableau d'en-têtes seulement, donc vous ne serez pas envoyer corps de la demande (4 arg) de cette façon. Le moyen le plus simple serait de passer ce tableau comme deuxième argument à la méthode sendAsync(). Il les reconnaît et l'option form_params sera analysé comme Content-Type: application/x-www-form-urlencoded-tête et créer un flux valide pour votre demande (il utilise la fonction http_build_query() si vous voulez le faire directement dans le constructeur de la demande):

$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();