Doing HTTP requests FROM Laravel to an external API

前端 未结 7 1674
隐瞒了意图╮
隐瞒了意图╮ 2020-11-27 09:59

What I want is get an object from an API with a HTTP (eg, jQuery\'s AJAX) request to an external api. How do I start? I did research on Mr Google but I can\'t find anything

相关标签:
7条回答
  • 2020-11-27 10:06

    We can use package Guzzle in Laravel, it is a PHP HTTP client to send HTTP requests.

    You can install Guzzle through composer

    composer require guzzlehttp/guzzle:~6.0
    

    Or you can specify Guzzle as a dependency in your project's existing composer.json

    {
       "require": {
          "guzzlehttp/guzzle": "~6.0"
       }
    }
    

    Example code in laravel 5 using Guzzle as shown below,

    use GuzzleHttp\Client;
    class yourController extends Controller {
    
        public function saveApiData()
        {
            $client = new Client();
            $res = $client->request('POST', 'https://url_to_the_api', [
                'form_params' => [
                    'client_id' => 'test_id',
                    'secret' => 'test_secret',
                ]
            ]);
            echo $res->getStatusCode();
            // 200
            echo $res->getHeader('content-type');
            // 'application/json; charset=utf8'
            echo $res->getBody();
            // {"type":"User"...'
    }
    
    0 讨论(0)
  • 2020-11-27 10:10

    You can use Httpful :

    Website : http://phphttpclient.com/

    Github : https://github.com/nategood/httpful

    0 讨论(0)
  • 2020-11-27 10:13

    Updated on March 21 2019

    Add GuzzleHttp package using composer require guzzlehttp/guzzle:~6.3.3

    Or you can specify Guzzle as a dependency in your project's composer.json

    {
       "require": {
          "guzzlehttp/guzzle": "~6.3.3"
       }
    }
    

    Include below line in the top of the class where you are calling the API

    use GuzzleHttp\Client;
    

    Add below code for making the request

    $client = new Client();
    
        $res = $client->request('POST', 'http://www.exmple.com/mydetails', [
            'form_params' => [
                'name' => 'george',
            ]
        ]);
    
        if ($res->getStatusCode() == 200) { // 200 OK
            $response_data = $res->getBody()->getContents();
        }
    
    0 讨论(0)
  • 2020-11-27 10:20

    As of Laravel v7.X, the framework now comes with a minimal API wrapped around the Guzzle HTTP client. It provides an easy way to make get, post, put, patch, and delete requests using the HTTP Client:

    use Illuminate\Support\Facades\Http;
    
    $response = Http::get('http://test.com');
    $response = Http::post('http://test.com');
    $response = Http::put('http://test.com');
    $response = Http::patch('http://test.com');
    $response = Http::delete('http://test.com');
    

    You can manage responses using the set of methods provided by the Illuminate\Http\Client\Response instance returned.

    $response->body() : string;
    $response->json() : array;
    $response->status() : int;
    $response->ok() : bool;
    $response->successful() : bool;
    $response->serverError() : bool;
    $response->clientError() : bool;
    $response->header($header) : string;
    $response->headers() : array;
    

    Please note that you will, of course, need to install Guzzle like so:

    composer require guzzlehttp/guzzle
    

    There are a lot more helpful features built-in and you can find out more about these set of the feature here: https://laravel.com/docs/7.x/http-client

    This is definitely now the easiest way to make external API calls within Laravel.

    0 讨论(0)
  • 2020-11-27 10:25

    Definitively, for any PHP project, you may want to use GuzzleHTTP for sending requests. Guzzle has very nice documentation you can check here. I just want to say that, you probably want to centralize the usage of the Client class of Guzzle in any component of your Laravel project (for example a trait) instead of being creating Client instances on several controllers and components of Laravel (as many articles and replies suggest).

    I created a trait you can try to use, which allows you to send requests from any component of your Laravel project, just using it and calling to makeRequest.

    namespace App\Traits;
    use GuzzleHttp\Client;
    trait ConsumesExternalServices
    {
        /**
         * Send a request to any service
         * @return string
         */
        public function makeRequest($method, $requestUrl, $queryParams = [], $formParams = [], $headers = [], $hasFile = false)
        {
            $client = new Client([
                'base_uri' => $this->baseUri,
            ]);
    
            $bodyType = 'form_params';
    
            if ($hasFile) {
                $bodyType = 'multipart';
                $multipart = [];
    
                foreach ($formParams as $name => $contents) {
                    $multipart[] = [
                        'name' => $name,
                        'contents' => $contents
                    ];
                }
            }
    
            $response = $client->request($method, $requestUrl, [
                'query' => $queryParams,
                $bodyType => $hasFile ? $multipart : $formParams,
                'headers' => $headers,
            ]);
    
            $response = $response->getBody()->getContents();
    
            return $response;
        }
    }
    

    Notice this trait can even handle files sending.

    If you want more details about this trait and some other stuff to integrate this trait to Laravel, check this article. Additionally, if interested in this topic or need major assistance, you can take my course which guides you in the whole process.

    I hope it helps all of you.

    Best wishes :)

    0 讨论(0)
  • 2020-11-27 10:26

    Based upon an answer of a similar question here: https://stackoverflow.com/a/22695523/1412268

    Take a look at Guzzle

    $client = new GuzzleHttp\Client();
    $res = $client->get('https://api.github.com/user', ['auth' =>  ['user', 'pass']]);
    echo $res->getStatusCode(); // 200
    echo $res->getBody(); // { "type": "User", ....
    
    0 讨论(0)
提交回复
热议问题