skip to Main Content

I have the following Postman request for testing a third party API;

enter image description here

What I am trying to do is convert this into code using Laravel’s HTTP class, the code i currently have is;

public function uploadToThridParty()
{
    $uploadContents = [
        'id' => 'this-is-my-id',
        'fileUpload' => true,
        'frontfile' => Storage::get('somefrontfile.jpg'),
        'sideview' => Storage::get('itsasideview.png'),
    ];

    $request = Http::withHeaders(
        [
            'Accept' => 'application/json',
        ]
    );

    $response = $request
        ->asForm()
        ->post(
            'https://urltoupload.com/upload', $uploadContents
        )
}

But every time I run this, the 3rd party API comes back with Invalid ID, even though if i use Postman with the same ID it works fine.

I cant seem to figure out where i am going wrong with my code;

2

Answers


  1. As @Cbroe mention about attach file before sending post request you can make this like this example:

    public function uploadToThridParty()
    {
        $uploadContents = [
            'id' => 'this-is-my-id',
            'fileUpload' => true
        ];
    
        $request = Http::withHeaders(
            [
                'Accept' => 'application/json',
            ]
        );
    
        $response = $request
            ->attach(
            'frontfile', file_get_contents(storage_path('somefrontfile.jpg')), 'somefrontfile.jpg' 
             )
            ->attach(
            'sideview', file_get_contents(storage_path('itsasideview.png')), 'itsasideview.jpg' 
             )
            ->post(
                'https://urltoupload.com/upload', $uploadContents
            )
    }
    

    Also i think you need remove asForm method because it’s override your header accept type to application/x-www-form-urlencoded that is way your exception is Invalid ID

    Login or Signup to reply.
  2. Some third party API would require you to have the request with content type as multipart/form data

    you can double check all the headers being pass on your postman request HEADERS tab and view on Hidden headers.

    If you indeed need your request to be in multipart/form-data, You can use the multipart options of guzzle.

    Although this doesnt seem to be on Laravel HTTP-Client docs, you can simply pass a asMultipart() method in your HTTP request

    just check the /vendor/laravel/framework/src/Illuminate/Support/Facades/Http.php for full reference of HTTP client.

    You can have your request like this.

    public function uploadToThridParty() {
        $uploadContents = [            
            [
                'name' => 'id',
                'contents' => 'this-is-my-id'
            ],
            [
                'name' => 'fileUpload',
                'contents' => true
            ],
            [ 
                'name' => 'frontfile', 
                'contents' => fopen( Storage::path( 'somefrontfile.jpg' ), 'r') 
            ], 
            [ 
                'name' => 'sideview', 
                'contents' => fopen( Storage::path( 'itsasideview.jpg' ), 'r') 
            ], 
        ];
    
        $request = Http::withHeaders(['Accept' => 'application/json']);
    
        $response = $request->asMultipart()->post('https://urltoupload.com/upload', $uploadContents );
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search