Thực hiện các yêu cầu HTTP TỪ Laravel sang API bên ngoài


157

Điều tôi muốn là đưa một đối tượng từ API có yêu cầu HTTP (ví dụ: AJAX của jQuery) sang một api bên ngoài. Làm thế nào để tôi bắt đầu? Tôi đã nghiên cứu về Mr Google nhưng tôi không thể tìm thấy bất cứ điều gì có ích.

Tôi bắt đầu tự hỏi là điều này thậm chí có thể? Trong bài đăng này, Laravel 4 thực hiện yêu cầu bài đăng từ bộ điều khiển đến url bên ngoài với dữ liệu có vẻ như nó có thể được thực hiện. Nhưng không có ví dụ hay nguồn nào để tìm tài liệu.

Hãy giúp tôi ra?


9
Một thời gian dài sau đó, đã tạo ra một tut thực sự nhỏ làm thế nào để sử dụng Guheads. Từ aisnoek câu trả lời của mình. chilion.nl/laravel-post-requests-with-guzzle
Chilion

Nếu vẫn quan tâm, bạn cũng có thể sử dụng Curl cho việc này, tôi đoán bạn có thể nói curl là ajax jjery cho PHP ở một số hình thức.
killstreet

Câu trả lời:


195

Dựa trên câu trả lời của một câu hỏi tương tự ở đây: https://stackoverflow.com/a/22695523/1412268

Hãy nhìn vào Guheads

$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
Ngoài ra, hãy xem câu trả lời của Jeremie Ges, Trông thật tuyệt, mặc dù nó không trả lời câu hỏi của tôi trong thực tế về cách thức của Laravel, tôi chắc chắn sẽ xem xét điều này. Cảm ơn!
Chilion

3
@Chilion, Al Snoek đã hướng dẫn bạn tới một gói chính thức của Laravel. Nó được cài đặt sẵn trong nhóm nhà cung cấp laravel.
parker_codes

tôi nhận được một đối tượng Stream thay vì chuỗi json. Ai đó có thể giúp tôi?
Renan Coelho

Tôi làm điều tương tự nhưng trình duyệt của tôi biến vô hạn
Amirouche Zeggagh 11/03/19

Hiện tại có một cách dễ dàng hơn trong Laravel 7.x: stackoverflow.com/a/60908329/2341298
Lốc xoáy

95

Chúng ta có thể sử dụng gói Guheads trong Laravel, đây là máy khách HTTP PHP để gửi các yêu cầu HTTP.

Bạn có thể cài đặt Guheads thông qua trình soạn nhạc

composer require guzzlehttp/guzzle:~6.0

Hoặc bạn có thể chỉ định Guheads là một phần phụ thuộc trong composer.json hiện có trong dự án của bạn

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

Mã ví dụ trong laravel 5 bằng cách sử dụng Guheads như dưới đây,

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
Cảm ơn bạn vì câu trả lời. Cũng xem bình luận của tôi dưới bài viết của tôi; Một thời gian dài sau đó, đã tạo ra một tut thực sự nhỏ làm thế nào để sử dụng Guheads. Từ aisnoek câu trả lời của mình. chilion.nl/laravel-post-requests-with-guzzle - Chilion 19 tháng 8 tại 00:09 √
Chilion

1
Nhận xét của bạn // "200"phải là // 200vì giá trị trả về là một số nguyên.
cơ khí

57

Bạn chỉ muốn gọi một URL bên ngoài và sử dụng kết quả? PHP thực hiện điều này ngay lập tức, nếu chúng ta đang nói về một yêu cầu GET đơn giản cho thứ gì đó phục vụ JSON:

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

Nếu bạn muốn thực hiện một yêu cầu bài đăng, nó khó hơn một chút nhưng có vô số ví dụ về cách thực hiện điều này với curl.

Vì vậy, tôi đoán câu hỏi là; Bạn thực sự muốn làm gì?


Tôi muốn có thể sử dụng tất cả các loại chức năng của API REST. Vì vậy, có, tôi sẽ cần POST. Tôi đã nghĩ (hy vọng ...) rằng Laravel sẽ có một số phương pháp để thực hiện nó theo cách thức của Laravel, nhưng sau đó tôi sẽ bám lấy PHP. Cảm ơn.
Chadel

Nếu bạn không cần kết quả, chỉ cần cố gắng HIT API hoặc PING một URL, đây là cách tiếp cận tốt nhất. Cảm ơn :)
Rafik Farhad

7

Cập nhật vào ngày 21 tháng 3 năm 2019

Thêm GuzzleHttpgói sử dụngcomposer require guzzlehttp/guzzle:~6.3.3

Hoặc bạn có thể chỉ định Guheads là một phụ thuộc trong dự án của bạn composer.json

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

Bao gồm dòng dưới đây trong đầu lớp mà bạn đang gọi API

use GuzzleHttp\Client;

Thêm mã dưới đây để thực hiện yêu cầu

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

7

Kể từ phiên bản Laravel v7.X , khung công tác giờ đây đi kèm với một API tối thiểu được bao bọc xung quanh máy khách Guheads HTTP . Nó cung cấp một cách dễ dàng để thực hiện nhận , đăng , đặt , xóa các yêu cầu bằng 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');

Bạn có thể quản lý các câu trả lời bằng cách sử dụng tập hợp các phương thức được cung cấp bởi Illuminate\Http\Client\Responsethể hiện được trả về.

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

Xin lưu ý rằng, tất nhiên, bạn sẽ cần phải cài đặt Guheads như vậy:

composer require guzzlehttp/guzzle

Có rất nhiều tính năng hữu ích tích hợp sẵn và bạn có thể tìm hiểu thêm về các tính năng này tại đây: https://laravel.com/docs/7.x/http-client

Đây chắc chắn là cách dễ nhất để thực hiện các cuộc gọi API bên ngoài trong Laravel.


5

Chắc chắn, đối với bất kỳ dự án PHP nào, bạn có thể muốn sử dụng GuheadsHTTP để gửi yêu cầu. Guheads có tài liệu rất hay bạn có thể kiểm tra ở đây . Tôi chỉ muốn nói rằng, có lẽ bạn muốn tập trung vào việc sử dụng lớp Máy khách của khách hàng trong bất kỳ thành phần nào trong dự án Laravel của bạn (ví dụ như một đặc điểm) thay vì tạo các phiên bản Máy khách trên một số bộ điều khiển và các thành phần của Laravel (như nhiều bài viết và trả lời đề nghị).

Tôi đã tạo một đặc điểm mà bạn có thể thử sử dụng, cho phép bạn gửi yêu cầu từ bất kỳ thành phần nào trong dự án Laravel của bạn, chỉ cần sử dụng nó và gọi tới 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;
    }
}

Lưu ý đặc điểm này thậm chí có thể xử lý các tập tin gửi.

Nếu bạn muốn biết thêm chi tiết về đặc điểm này và một số nội dung khác để tích hợp đặc điểm này với Laravel, hãy kiểm tra bài viết này . Ngoài ra, nếu quan tâm đến chủ đề này hoặc cần hỗ trợ lớn, bạn có thể tham gia khóa học của tôi hướng dẫn bạn trong toàn bộ quá trình.

Tôi hy vọng nó sẽ giúp tất cả các bạn.

Lời chúc tốt nhất :)


1

Bạn có thể sử dụng httpful:

Trang web: http://phphttpclient.com/

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


Trông thật tuyệt, mặc dù nó không trả lời câu hỏi của tôi trong thực tế về cách thức của Laravel, tôi chắc chắn sẽ xem xét điều này. Cảm ơn!
Chilion

1
Laravel chưa lấy cái này ra khỏi hộp, nhưng Laravel chạy theo nhà soạn nhạc để bạn có thể sử dụng một lib như httpful để hoàn thành công việc. Bằng cách này bạn có thể sử dụng cũng requests.ryanmccue.info
Jeremie Ges

Laravel thuộc nhà soạn nhạc nên bất kỳ gói nào cũng là trò chơi công bằng.
kratos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.