Laravel'den harici bir API'ya HTTP istekleri yapma


157

Ne istediğim bir API (örneğin, jQuery's AJAX) harici bir API bir API ile bir nesne almaktır. Nasıl başlarım? Google'da araştırma yaptım, ancak yardımcı olacak hiçbir şey bulamıyorum.

Bu mümkün olduğunu merak etmeye başladım mı? Bu yazıda Laravel 4, yapılabilecek gibi görünen verilerle denetleyiciden harici url'ye posta isteği yapıyor . Ancak bazı belgeleri bulabileceğiniz herhangi bir örnek veya kaynak yoktur.

Lütfen bana yardım edin?


9
Uzun zaman sonra, Guzzle'ı kullanmak için gerçekten küçük bir tutku yarattı. Onun cevabını aisnoek'ten. chilion.nl/laravel-post-requests-with-guzzle
Chilion

Hala ilgilenen varsa da bunun için Curl kullanabilirsiniz, sanırım curl bazı formda PHP için jquery ajax olduğunu söyleyebiliriz.
killstreet

Yanıtlar:


195

Burada benzer bir sorunun cevabına dayanarak: https://stackoverflow.com/a/22695523/1412268

Guzzle'a bir göz atın

$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
Ayrıca Jeremie Ges'in cevabına bakın, Harika görünüyor, aslında bir Laravel türüyle ilgili sorumu cevaplamasa da, buna bakacağım. Teşekkürler!
Chilion

3
@Chilion, Al Snoek sizi resmi bir Laravel paketine yönlendiriyordu. Laravel satıcı grubuna önceden kurulmuştur.
parker_codes

im json dizesi yerine bir Stream nesnesi alıyorum. birisi bana yardım edebilir mi?
Renan Coelho

Aynı şeyi yapıyorum ama tarayıcım
sonsuzca dönüyor

Laravel 7.x'te artık daha kolay bir yol var: stackoverflow.com/a/60908329/2341298
Syclone

95

Laravel'de Guzzle paketini kullanabiliriz, HTTP istekleri göndermek için bir PHP HTTP istemcisidir.

Guzzle'ı besteci aracılığıyla kurabilirsiniz

composer require guzzlehttp/guzzle:~6.0

Veya Guzzle'ı projenizin mevcut bestecisinde bağımlılık olarak belirtebilirsiniz.

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

Aşağıda gösterildiği gibi Guzzle kullanarak laravel 5'te örnek kod,

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
Cevabınız için teşekkür ederim. Ayrıca yazımın altındaki yorumuma bakın; Uzun zaman sonra, Guzzle'ı kullanmak için gerçekten küçük bir tutku yarattı. Onun cevabını aisnoek'ten. chilion.nl/laravel-post-requests-with-guzzle - Chilion Aug 19 √ Saat 12:09
Chilion

1
Yorumunuz , döndürülen değerin bir tamsayı // "200"olması // 200nedeniyle olmalıdır .
mekanik

57

Sadece harici bir URL'yi aramak ve sonuçları kullanmak mı istiyorsunuz? JSON'a hizmet eden bir şeye basit bir GET isteği hakkında konuşuyorsak, PHP bunu kutudan çıkarır:

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

Bir gönderi isteği yapmak istiyorsanız, biraz daha zor ama bunu curl ile nasıl yapacağınıza dair birçok örnek var.

Yani soru şu; tam olarak ne istiyorsun?


Bir REST API her türlü işlevini kullanabilmek istiyorum. Yani evet, POST'a ihtiyacım olacak. Laravel'in bir Laravel türünde bunu yapmak için bazı yöntemleri olacağını düşündüm (umuyordum ...), ancak PHP'ye bağlı kalacağım. Teşekkürler.
Chilion

Sonuca ihtiyacınız yoksa, sadece API'ye vurmaya veya bir URL'ye PING göndermeye çalışıyorsanız, bu en iyi yaklaşımdır. Teşekkürler :)
Rafik Farhad

8

İtibariyle laravel v7.x , çerçeve şimdi sarılı minimal API ile geliyor guzzle HTTP istemcisi . HTTP İstemcisi'ni kullanarak istekleri almak , göndermek , koymak , yama yapmak ve silmek için kolay bir yol sağlar :

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

Yanıtları, Illuminate\Http\Client\Responsedöndürülen örnek tarafından sağlanan yöntemler kümesini kullanarak yönetebilirsiniz .

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

Elbette, Guzzle'ı şu şekilde yüklemeniz gerekeceğini lütfen unutmayın:

composer require guzzlehttp/guzzle

Yerleşik çok daha fazla yararlı özellik var ve bu özellik kümesi hakkında daha fazla bilgiyi burada bulabilirsiniz: https://laravel.com/docs/7.x/http-client

Bu kesinlikle Laravel içinde harici API çağrıları yapmanın en kolay yoludur.


7

21 Mart 2019'da güncellendi

GuzzleHttpKullanarak paket eklecomposer require guzzlehttp/guzzle:~6.3.3

Veya Guzzle'ı projenizde bağımlılık olarak belirtebilirsiniz. composer.json

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

API'yı çağırdığınız sınıfın üst kısmına aşağıdaki satırı ekleyin

use GuzzleHttp\Client;

İstekte bulunmak için aşağıdaki kodu ekleyin

$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

Kesinlikle, herhangi bir PHP projesi için, istekleri göndermek için GuzzleHTTP kullanmak isteyebilirsiniz. Guzzle burada kontrol edebileceğiniz çok güzel belgelere sahip . Sadece şunu söylemek istiyorum, Laravel projenizin herhangi bir bileşeninde (örneğin bir özellik) Client sınıf Guzzle kullanımını, Laravel'in çeşitli denetleyicileri ve bileşenlerinde İstemci örnekleri oluşturmak yerine merkezileştirmek istediğinizi söylemek istiyorum. ve cevaplar önermek).

Kullanmaya çalışabileceğiniz bir özellik oluşturdum, bu da Laravel projenizin herhangi bir bileşeninden, sadece onu kullanarak ve arayarak istek göndermenizi sağlar 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;
    }
}

Bu özelliğin dosya gönderme işlemlerini bile gerçekleştirebileceğine dikkat edin.

Bu özellik hakkında daha fazla ayrıntı ve bu özelliği Laravel'e entegre etmek için bu makaleye bakın . Ayrıca, bu konuyla ilgileniyorsanız veya büyük yardıma ihtiyacınız varsa, tüm süreç boyunca size yol gösteren kursumu alabilirsiniz .

Umarım hepinize yardımcı olur.

En iyi dileklerimle :)


1

Httpful'ı kullanabilirsiniz:

Web sitesi: http://phphttpclient.com/

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


Harika görünüyor, ancak aslında bir Laravel türüyle ilgili sorumu cevaplamasa da, buna bakacağım. Teşekkürler!
Chilion

1
Laravel bunu kutudan çıkarmadı, ancak Laravel besteci altında koştu, böylece işi yapmak için Httpful gibi bir lib'i kullanabilirsiniz. Bu arada istekleri
Ryanmccue.info

Laravel besteci altında olduğundan herhangi bir paket adil bir oyundur.
kratos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.