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


157

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

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

Sil te plait aide moi?


9
Longtemps plus tard, a créé un très petit tut comment utiliser Guzzle. De aisnoek sa réponse. chilion.nl/laravel-post-requests-with-guzzle
Chilion

Si vous êtes toujours intéressé, vous pouvez également utiliser Curl pour cela, je suppose que vous pourriez dire que curl est le jquery ajax pour PHP sous une forme ou une autre.
killstreet

Réponses:


195

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

Jetez un œil à 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", ....

2
Voir aussi la réponse de Jeremie Ges, Ça a l'air génial, bien que cela ne réponde pas à ma question en fait sur un peu Laravel, je vais certainement examiner cela. Merci!
Chilion

3
@Chilion, Al Snoek vous dirigeait vers un package Laravel officiel. Il est pré-installé dans le groupe de fournisseurs laravel.
parker_codes

im obtenant un objet Stream au lieu de la chaîne json. Est-ce que quelqu'un peut m'aider?
Renan Coelho

Je fais la même chose mais mon navigateur tourne à l'infini
Amirouche Zeggagh

Il existe maintenant un moyen plus simple dans Laravel 7.x: stackoverflow.com/a/60908329/2341298
Syclone

95

On peut utiliser le package Guzzle dans Laravel, c'est un client PHP HTTP pour envoyer des requêtes HTTP.

Vous pouvez installer Guzzle via composer

composer require guzzlehttp/guzzle:~6.0

Ou vous pouvez spécifier Guzzle comme 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"...'
}

2
Merci pour votre réponse. Voir aussi mon commentaire ci-dessous mon message; Longtemps plus tard, a créé un très petit tut comment utiliser Guzzle. De aisnoek sa réponse. chilion.nl/laravel-post-requests-with-guzzle - Chilion 19 août à 12:09 √
Chilion

1
Votre commentaire // "200"doit être // 200parce que la valeur renvoyée est un entier.
Mechanicious

57

Vous souhaitez simplement appeler une URL externe et utiliser les résultats? PHP fait cela hors de la boîte, 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 comment faire cela avec curl.

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


Je veux pouvoir utiliser toutes sortes de fonctions d'une API REST. Alors oui, j'aurai besoin de POST. Je pensais (espérait ...) que Laravel aurait des méthodes pour le faire d'une manière un peu Laravel, mais je m'en tiendrai à PHP alors. Merci.
Chilion

Si vous n'avez pas besoin du résultat, essayez simplement de HITER l'API ou de PING une URL, c'est la meilleure approche. Merci :)
Rafik Farhad

8

À partir de Laravel v7.X , le framework est désormais livré avec une API minimale enveloppée autour du client HTTP Guzzle . Il fournit un moyen simple de faire des requêtes get , post , put , patch et delete à l'aide du client HTTP :

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');

Vous pouvez gérer les réponses à l'aide de l'ensemble des méthodes fournies par l' Illuminate\Http\Client\Responseinstance renvoyée.

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

Veuillez noter que vous devrez, bien sûr, installer Guzzle comme ceci:

composer require guzzlehttp/guzzle

Il y a beaucoup plus de fonctionnalités utiles intégrées et vous pouvez en savoir plus sur ces ensembles de fonctionnalités ici: https://laravel.com/docs/7.x/http-client

C'est définitivement le moyen le plus simple de faire des appels d'API externes dans Laravel.


7

Mis à jour le 21 mars 2019

Ajouter un GuzzleHttppackage à l'aide decomposer require guzzlehttp/guzzle:~6.3.3

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

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

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

use GuzzleHttp\Client;

Ajouter ci-dessous le code 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();
    }

5

En définitive, pour tout projet PHP, vous souhaiterez peut-être utiliser GuzzleHTTP pour l'envoi de requêtes. Guzzle a une très belle documentation que vous pouvez consulter ici . Je veux juste dire que, vous souhaitez 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 (autant d'articles et réponses suggèrent).

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, en l'utilisant simplement 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 d'autres éléments pour intégrer ce trait à Laravel, consultez cet article . De plus, si vous êtes intéressé par ce sujet ou avez besoin d'une assistance majeure, vous pouvez suivre mon cours qui vous guide tout au long du processus.

J'espère que cela vous aidera tous.

Meilleurs vœux :)


1

Vous pouvez utiliser Httpful:

Site Web: http://phphttpclient.com/

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


Ça a l'air génial, bien que cela ne réponde pas à ma question en fait sur un moyen Laravel, je vais certainement examiner cela. Merci!
Chilion

1
Laravel n'a pas réussi à sortir de la boîte, mais Laravel fonctionne sous composer afin que vous puissiez utiliser une bibliothèque comme Httpful pour faire le travail. En passant, vous pouvez également utiliser requests.ryanmccue.info
Jeremie Ges

Laravel est sous compositeur, donc tout paquet est un jeu équitable.
kratos
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.