[php] Laravel에서 외부 API로 HTTP 요청 수행

내가 원하는 것은 HTTP (예 : jQuery의 AJAX) 요청이있는 API에서 외부 API로 객체를 얻는 것입니다. 어떻게 시작합니까? Google에 대해 조사했지만 도움이 될만한 내용이 없습니다.

궁금해지기 시작한이조차도 가능합니까? 이 게시물에서 Laravel 4는 컨트롤러에서 외부 URL로 게시 요청을 수행하여 가능한 것처럼 보입니다. 그러나 일부 문서를 찾을 수있는 예나 소스는 없습니다.

도와주세요?



답변

https://stackoverflow.com/a/22695523/1412268 에서 비슷한 질문에 대한 답변을 기반으로합니다.

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", ....


답변

Laravel에서 패키지 Guzzle을 사용할 수 있습니다. HTTP 요청을 보내는 PHP HTTP 클라이언트입니다.

작곡가를 통해 Guzzle을 설치할 수 있습니다

composer require guzzlehttp/guzzle:~6.0

또는 프로젝트의 기존 composer.json에서 Guzzle을 종속성으로 지정할 수 있습니다.

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

아래와 같이 Guzzle을 사용하는 laravel 5의 예제 코드

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


답변

외부 URL을 호출하고 결과를 사용하고 싶습니까? JSON을 제공하는 무언가에 대한 간단한 GET 요청에 대해 이야기하는 경우 PHP는 즉시 이것을 수행합니다.

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

게시 요청을하고 싶다면 조금 어렵지만 curl을 사용하여이를 수행하는 방법에 대한 예제가 많이 있습니다.

그래서 나는 그 질문이 있다고 생각합니다. 정확히 무엇을 원하세요?


답변

2019 년 3 월 21 일에 업데이트 됨

GuzzleHttp사용하여 패키지 추가composer require guzzlehttp/guzzle:~6.3.3

또는 Guzzle을 프로젝트의 종속성으로 지정할 수 있습니다 composer.json

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

API를 호출하는 클래스의 맨 아래에 아래 행을 포함하십시오.

use GuzzleHttp\Client;

요청을 위해 아래 코드를 추가하십시오

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


답변

현재 Laravel v7.X , 프레임 워크는 이제 감싸 최소한의 API와 함께 제공 목구멍 HTTP 클라이언트 . HTTP 클라이언트를 사용하여 get , post , put , patchdelete 요청을 쉽게 수행 할 수 있습니다 .

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

Illuminate\Http\Client\Response리턴 된 인스턴스가 제공 한 메소드 세트를 사용하여 응답을 관리 할 수 ​​있습니다 .

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

물론 다음과 같이 Guzzle을 설치해야합니다.

composer require guzzlehttp/guzzle

더 유용한 기능이 내장되어 있으며 다음 기능에 대한 자세한 내용은 https://laravel.com/docs/7.x/http-client에서 확인할 수 있습니다.

이것이 Laravel 내에서 외부 API 호출을 수행하는 가장 쉬운 방법입니다.


답변

확실히, 모든 PHP 프로젝트의 경우 요청을 보내는 데 GuzzleHTTP를 사용할 수 있습니다. Guzzle에는 여기에서 확인할 수있는 매우 유용한 문서가 있습니다 . Laravel의 여러 컨트롤러 및 구성 요소에서 많은 인스턴스를 생성하는 대신 Laravel 프로젝트의 모든 구성 요소 (예 : 특성)에서 Guzzle의 Client 클래스 사용을 중앙 집중화하고 싶을 것입니다. 답장은 제안합니다).

사용할 수있는 특성을 만들었습니다.이를 통해 Laravel 프로젝트의 모든 구성 요소에서 요청을 보내고을 호출 할 수 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;
    }
}

이 특성은 파일 전송도 처리 할 수 ​​있습니다.

이 특성과이 특성을 Laravel에 통합하기위한 기타 사항에 대한 자세한 내용을 보려면이 기사를 확인 하십시오 . 또한이 주제에 관심이 있거나 주요 지원이 필요한 경우 전체 과정 을 안내하는 내 과정수강 할 수 있습니다 .

여러분 모두에게 도움이 되길 바랍니다.

최고의 소원 🙂


답변

Httpful을 사용할 수 있습니다 :

웹 사이트 : http://phphttpclient.com/

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