web-dev-qa-db-fra.com

Faire des requêtes HTTP DE Laravel à une API externe

Ce que je veux, c'est obtenir un objet d'une API avec une requête HTTP (par exemple, AJAX de jQuery) à une API externe. Comment je commence? J'ai fait des recherches sur M. Google mais je ne trouve rien qui puisse l'aider.

Je commence à me demander si c'est même possible? Dans ce message Laravel 4 fait une demande de message du contrôleur à une URL externe avec des données il semble que cela puisse être fait. Mais il n'y a pas d'exemple ni de source où trouver de la documentation.

Sil te plait aide moi?

129
Chilion

Basé sur une réponse à une question similaire ici: https://stackoverflow.com/a/22695523/1412268

Jetez un oeil à 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", ....
165
AI Snoek

Nous pouvons utiliser le paquetage Guzzle dans Laravel, c’est un client HTTP PHP pour envoyer des requêtes HTTP.

Vous pouvez installer Guzzle via le compositeur

composer require guzzlehttp/guzzle:~6.0

Ou vous pouvez spécifier Guzzle en tant que dépendance dans le fichier composer.json existant de votre projet.

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

Exemple de code dans laravel 5 en utilisant Guzzle comme indiqué ci-dessous,

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"...'
}
82
Mohammed Safeer

Vous voulez juste appeler une URL externe et utiliser les résultats? PHP fait ceci immédiatement, si nous parlons d'une simple requête GET à quelque chose qui sert JSON:

$json = json_decode(file_get_contents('http://Host.com/api/stuff/1'), true);

Si vous voulez faire une demande de publication, c'est un peu plus difficile, mais il y a beaucoup d'exemples sur la façon de faire cela avec curl.

Donc, je suppose que la question est: Que voulez-vous exactement?

49
Bram

Mise à jour le 21 mars 2019

Ajouter le package GuzzleHttp à l'aide de composer require guzzlehttp/guzzle:~6.3.3

Ou vous pouvez spécifier Guzzle comme dépendance dans le fichier composer.json de votre projet.

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

Inclure ci-dessous la ligne en haut de la classe où vous appelez l'API

use GuzzleHttp\Client;

Ajouter le code ci-dessous pour faire la demande

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

Vous pouvez utiliser Httpful:

Site Web: http://phphttpclient.com/

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

1
Jeremie Ges

En définitive, pour tout projet PHP, vous pouvez utiliser GuzzleHTTP pour envoyer des demandes. Guzzle a une très belle documentation que vous pouvez vérifier ici . Je veux juste dire que vous souhaiterez probablement centraliser l'utilisation de la classe Client de Guzzle dans n'importe quel composant de votre projet Laravel (par exemple, un trait) au lieu de créer des instances client sur plusieurs contrôleurs et composants. de Laravel (comme le suggèrent de nombreux articles et réponses).

J'ai créé un trait que vous pouvez essayer d'utiliser, qui vous permet d'envoyer des requêtes à partir de n'importe quel composant de votre projet Laravel, simplement en l'utilisant et en appelant 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;
    }
}

Notez que cette caractéristique peut même gérer l'envoi de fichiers.

Si vous voulez plus de détails sur ce trait et sur d'autres éléments pour intégrer ce trait à Laravel, cochez ceci article . De plus, si vous êtes intéressé par ce sujet ou avez besoin d’une assistance majeure, vous pouvez choisir mon cours , qui vous guide tout au long du processus.

J'espère que cela vous aide tous.

Meilleurs vœux :)

0
JuanDMeGon