Joshua Ziering
Joshua Ziering

Reputation: 145

Guzzle Not Sending Headers From Form MultiPart

I am using "guzzlehttp/guzzle": "~6.0", and trying to post a file to an API endpoint. The file posts fine when using RequestBin but the API is not getting the header it requires. The Header is not sent to Request bin either. According to the docs, I need to do an array of associative arrays. http://docs.guzzlephp.org/en/latest/quickstart.html#post-form-requests

However, this is not working. Here's the Guzzle request:

$client = new GuzzleHttp\Client(['base_uri' => '127.0.0.1:3000']);
        $response = $client->request('POST', '/process', [
            'multipart' => [
                [
                    'name'     => 'file',
                    'contents' => $file,
                    'bucketName' => 'test',
                    'headers'  => ['X-API-Key' => 'abc345']
                ],
            ]
        ]);

What am I doing wrong that it's not sending the header?

Thank you very much,

Josh

Upvotes: 3

Views: 7935

Answers (2)

Felipe Castillo
Felipe Castillo

Reputation: 567

You were probably using multipart in conjunction with form_params , this is not explicitly explained in the documentation of laravel but guzzle won't work with both

Note

multipart cannot be used with the form_params option. You will need to use one or the other. Use form_params for application/x-www-form-urlencoded requests, and multipart for multipart/form-data requests.

This option cannot be used with body, form_params, or json

To solve this problem you will need to parse all the params to multipart, if you are using laravel or lumen you can do it in this way

if(!empty($this->files))
                {

                 //if there is an image parse all the rest parameters to 
                 // multipart

                  $file_keys=array_keys($this->files);

                  foreach($this->files as $k => $file)
                  {
                  $http = $http->attach($k, file_get_contents($file),$k);
                  }

                  foreach($this->data as $dk =>&$d)
                  {
                     if(!in_array($dk,$file_keys))
                     {
                        if(is_array($d))
                        {
                           $d=json_encode($d);
                        }

                        $http = $http->attach($dk,$d);
  
                     }

                  }

                  return $http=$http->post($this->url);
 
                }
                //if there isn't any file just send all as form_params

               return $http=$http->post($this->url,$this->data);

Upvotes: 0

vuliad
vuliad

Reputation: 2152

Headers is an $option, that's mean it must be at the same level as multipart.

<?php
      $response = $client->request('POST', '/process', [
        'multipart' => [
            [
                'name' => 'file',
                'contents' => 'test',
                'bucketName' => 'test',
            ],
        ],
        'headers' => ['X-API-Key' => 'abc345'] // <------- HERE
    ]);

Upvotes: 3

Related Questions