PHP에서 REST API 호출


317

고객이 PHP 호출을해야하는 REST API를 제공했습니다. 그러나 실제로 API와 함께 제공된 설명서는 매우 제한되어 있으므로 실제로 서비스를 호출하는 방법을 모르겠습니다.

Google에 시도했지만 이미 만료 된 것은 Yahoo! 서비스 호출 방법에 대한 자습서. 헤더 또는 깊이있는 정보는 언급하지 않았습니다.

REST API를 호출하는 방법에 대한 적절한 정보 또는 이에 대한 문서가 있습니까? W3schools에서도 SOAP 방법 만 설명합니다. PHP에서 rest API를 만들기위한 다른 옵션은 무엇입니까?

답변:


438

PHPs cURLExtension으로 모든 REST API에 액세스 할 수 있습니다 . 그러나 API 문서 (메서드, 파라미터 등)는 고객이 제공해야합니다!

예:

// Method: POST, PUT, GET etc
// Data: array("param" => "value") ==> index.php?param=value

function CallAPI($method, $url, $data = false)
{
    $curl = curl_init();

    switch ($method)
    {
        case "POST":
            curl_setopt($curl, CURLOPT_POST, 1);

            if ($data)
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            break;
        case "PUT":
            curl_setopt($curl, CURLOPT_PUT, 1);
            break;
        default:
            if ($data)
                $url = sprintf("%s?%s", $url, http_build_query($data));
    }

    // Optional Authentication:
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($curl, CURLOPT_USERPWD, "username:password");

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($curl);

    curl_close($curl);

    return $result;
}

1
@Michiel : HTTP 요청 방법 (GET, POST, PUT 등). API에 따라 다른 방법이 필요합니다. 즉, 읽기 GET, 쓰기 POST
Christoph Winkler

2
@Michiel $data은 api 메소드로 전송 된 데이터를 보유하는 연관 배열 (data [fieldname] = value)입니다.
Christoph Winkler

1
큰 도움을 주셔서 감사합니다!
Michiel

2
curl_close함수는 호출되지 않으며 CallAPI 함수가 반복적으로 호출되면 추가 메모리 소비가 발생할 수 있습니다.
Bart Verkoeijen

1
아래 @colan의 대답이 더 좋습니다. 자체 오류 처리 및 래퍼 메서드를 작성하여 번거 로움을 덜어줍니다.
Andreas

186

URL이 있고 PHP가 지원하는 경우 file_get_contents를 호출하면됩니다.

$response = file_get_contents('http://example.com/path/to/api/call?param1=5');

$ response가 JSON 인 경우 json_decode를 사용하여 PHP 배열로 변환하십시오.

$response = json_decode($response);

$ response가 XML 인 경우 simple_xml 클래스를 사용하십시오.

$response = new SimpleXMLElement($response);

http://sg2.php.net/manual/en/simplexml.examples-basic.php


30
REST 엔드 포인트가 HTTP 오류 상태 (예 : 401) file_get_contents를 리턴하면 함수는 경고와 함께 실패하고 널을 리턴합니다. 본문에 오류 메시지가 있으면 검색 할 수 없습니다.
Bart Verkoeijen

3
주요 단점은 URL에 액세스하려면 PHP 설치에 fopen 래퍼가 활성화되어 있어야한다는 것입니다. fopen 랩퍼가 사용 가능하지 않으면 웹 서비스 요청에 file_get_contents를 사용할 수 없습니다.
Oriol

2
fopen 래퍼는 현재 취약성으로 보이는 PHP의 일부에 속하므로 일부 호스트가이를 비활성화하는 것을 볼 수 있습니다.
Marcus Downing

153

Guzzle을 사용하십시오 . "HTTP / 1.1로 작업하기 쉽고 웹 서비스 소비로 인한 고통을 덜어주는 PHP HTTP 클라이언트입니다." cURL을 사용하는 것보다 Guzzle을 사용하는 것이 훨씬 쉽습니다.

다음은 웹 사이트의 예입니다.

$client = new GuzzleHttp\Client();
$res = $client->get('https://api.github.com/user', [
    'auth' =>  ['user', 'pass']
]);
echo $res->getStatusCode();           // 200
echo $res->getHeader('content-type'); // 'application/json; charset=utf8'
echo $res->getBody();                 // {"type":"User"...'
var_export($res->json());             // Outputs the JSON decoded data

20
여전히 cURL을 사용하는 사람은이 옵션을 면밀히 검토하지 않았습니다.
JoshuaDavid

좋아 보인다. 그러나 PNG를 가져 오는 것은 어떻습니까? 지도 타일 용. 링크 한 웹 페이지에서 언급 한 JSON 데이터 만 찾을 수 있습니다.
Henrik Erlandsson

20

CURL은 가장 간단한 방법입니다. 간단한 전화입니다

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "THE URL TO THE SERVICE");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, POST DATA);
$result = curl_exec($ch);


print_r($result);
curl_close($ch);

1
well @ erm3nda OP는 "서비스를 어떻게 호출해야할지 모르겠습니다"라고 말하지 않습니다. REST API를 사용하는 가장 좋은 방법은 아닙니다.
Broncha

4
와우, 당신은 당신의 의견을 더 좋게 만드는 대신에 아이러니 한 답장을하기 위해 당신의 노력과 시간을 낭비합니다. 그런 식으로 행운을 빕니다.
m3nda 2014

2
이것이 얼마나 간단한 지 사랑하십시오. 그것을 유지
cyber8200

@Sadik POST DATA는 단지 자리 표시 자입니다. 여기에 게시물 데이터를 보내야합니다
Broncha

12

HTTPFUL 사용

Httpful은 말하는 HTTP를 제정신으로 만들기위한 단순하고 체인 가능하며 읽을 수있는 PHP 라이브러리입니다. 개발자는 curl set_opt 페이지를 선별하는 대신 API와의 상호 작용에 집중할 수 있으며 이상적인 PHP REST 클라이언트입니다.

Httpful 포함 사항 ...

  • 읽을 수있는 HTTP 메소드 지원 (GET, PUT, POST, DELETE, HEAD 및 OPTIONS)
  • 맞춤 헤더
  • 자동 "스마트"구문 분석
  • 자동 페이로드 직렬화
  • 기본 인증
  • 클라이언트 측 인증서 인증
  • "템플릿"요청

전의.

GET 요청을 보내십시오. 자동으로 파싱 된 JSON 응답을받습니다.

라이브러리는 응답에서 JSON Content-Type을 확인하고 응답을 기본 PHP 객체로 자동 구문 분석합니다.

$uri = "https://www.googleapis.com/freebase/v1/mqlread?query=%7B%22type%22:%22/music/artist%22%2C%22name%22:%22The%20Dead%20Weather%22%2C%22album%22:%5B%5D%7D";
$response = \Httpful\Request::get($uri)->send();

echo 'The Dead Weather has ' . count($response->body->result->album) . " albums.\n";

나는 해결책으로 HTTPFUL를 사용하려고하고 같은 JSON 파싱 할 수 있는지 확실하지 않다 $condition = $response->weather[0]->main;난 그냥 PHP 측의 잘못을하고있는 중이 야하지 않는 한이
weteamsteve

9

호출하는 REST API가 또는를 지원 GET하는지 POST또는 두 가지 방법을 모두 알아야 합니다. 아래 코드는 저에게 맞는 것입니다. 내 웹 서비스 API를 호출하고 있으므로 API가 무엇을 가져오고 무엇을 반환할지 이미 알고 있습니다. GETPOST메소드를 모두 지원 하므로 덜 민감한 정보는로 들어가고 URL (GET)username 및 password와 같은 정보는 POST변수 로 제출됩니다 . 또한 모든 것이 HTTPS연결을 통과합니다 .

API 코드 내에서 json 형식으로 반환하려는 배열을 인코딩 한 다음 단순히 PHP 명령 echo $my_json_variable을 사용하여 해당 json 문자열을 클라이언트에서 사용할 수있게하십시오.

보시다시피, 내 API는 json 데이터를 반환하지만 API의 응답 형식이 무엇인지 알아야합니다 (또는 반환 된 데이터를 확인해야 함).

이것이 클라이언트 측에서 API에 연결하는 방법입니다.

$processed = FALSE;
$ERROR_MESSAGE = '';

// ************* Call API:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.myapi.com/api.php?format=json&action=subscribe&email=" . $email_to_subscribe);
curl_setopt($ch, CURLOPT_POST, 1);// set post data to true
curl_setopt($ch, CURLOPT_POSTFIELDS,"username=myname&password=mypass");   // post data
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
curl_close ($ch);

// returned json string will look like this: {"code":1,"data":"OK"}
// "code" may contain an error code and "data" may contain error string instead of "OK"
$obj = json_decode($json);

if ($obj->{'code'} == '1')
{
  $processed = TRUE;
}else{
  $ERROR_MESSAGE = $obj->{'data'};
}

...

if (!$processed && $ERROR_MESSAGE != '') {
    echo $ERROR_MESSAGE;
}

BTW, 나는 또한 file_get_contents()여기에 제안 된 일부 사용자가 방법 을 사용하려고 했지만 그다지 잘 작동하지 않습니다. curl방법이 더 빠르고 안정적 이라는 것을 알았습니다 .


5

실제로 많은 고객이 있습니다. 그들 중 하나는 해충입니다 -이것을 확인하십시오. 그리고 이러한 REST 호출은 GET, POST, PUT 및 DELETE 등 다양한 방법으로 간단한 http 요청입니다.


4

함수 이름에서 제안 하는 메소드 외에도 file_get_contentshttp POST/PUT/DELETE/OPTIONS/HEAD메소드 를 발행하는 데 사용할 수 있습니다 GET.

file_get_contents를 사용하여 PHP로 데이터를 게시하는 방법은 무엇입니까?


1
file_get_content는 API와 관련하여 정말 나쁜 생각입니다. stackoverflow.com/questions/13004805/… file_get_contents_curl과 같은 사용자 정의 메소드를 설정하고 일반 PHP 솔루션 대신 사용할 수 있습니다. stackoverflow.com/questions/8540800/…
Eryk Wróbel

3

Symfony를 사용하는 경우 ~ 100 개의 예외를 모두 포함하고 의미없는 오류 코드 + 메시지를 반환하는 대신 예외를 처리하는 훌륭한 휴식 클라이언트 번들이 있습니다.

당신은 정말로 그것을 확인해야합니다 : https://github.com/CircleOfNice/CiRestClientBundle

나는 인터페이스를 좋아한다.

try {
    $restClient = new RestClient();
    $response   = $restClient->get('http://www.someUrl.com');
    $statusCode = $response->getStatusCode();
    $content    = $response->getContent();
} catch(OperationTimedOutException $e) {
    // do something
}

모든 http 메소드에서 작동합니다.


2

@Christoph Winkler가 언급했듯이 이것을 달성하기위한 기본 클래스입니다.

curl_helper.php

// This class has all the necessary code for making API calls thru curl library

class CurlHelper {

// This method will perform an action/method thru HTTP/API calls
// Parameter description:
// Method= POST, PUT, GET etc
// Data= array("param" => "value") ==> index.php?param=value
public static function perform_http_request($method, $url, $data = false)
{
    $curl = curl_init();

    switch ($method)
    {
        case "POST":
            curl_setopt($curl, CURLOPT_POST, 1);

            if ($data)
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            break;
        case "PUT":
            curl_setopt($curl, CURLOPT_PUT, 1);
            break;
        default:
            if ($data)
                $url = sprintf("%s?%s", $url, http_build_query($data));
    }

    // Optional Authentication:
    //curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    //curl_setopt($curl, CURLOPT_USERPWD, "username:password");

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($curl);

    curl_close($curl);

    return $result;
}

}

그러면 언제든지 파일을 포함하고 사용할 수 있습니다. 예 : any.php

    require_once("curl_helper.php");
    ...
    $action = "GET";
    $url = "api.server.com/model"
    echo "Trying to reach ...";
    echo $url;
    $parameters = array("param" => "value");
    $result = CurlHelper::perform_http_request($action, $url, $parameters);
    echo print_r($result)

0

타사 도구를 사용할 수있는 경우이 도구를 살펴보십시오. https://github.com/CircleOfNice/DoctrineRestDriver

이것은 API로 작업하는 완전히 새로운 방법입니다.

우선 들어오고 나가는 데이터의 구조를 정의하는 엔티티를 정의하고 데이터 소스로 주석을 달 수 있습니다.

/*
 * @Entity
 * @DataSource\Select("http://www.myApi.com/products/{id}")
 * @DataSource\Insert("http://www.myApi.com/products")
 * @DataSource\Select("http://www.myApi.com/products/update/{id}")
 * @DataSource\Fetch("http://www.myApi.com/products")
 * @DataSource\Delete("http://www.myApi.com/products/delete/{id}")
 */
class Product {
    private $name;

    public function setName($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

이제 REST API와 통신하는 것이 매우 쉽습니다.

$product = new Product();
$product->setName('test');
// sends an API request POST http://www.myApi.com/products ...
$em->persist($product);
$em->flush();

$product->setName('newName');
// sends an API request UPDATE http://www.myApi.com/products/update/1 ...
$em->flush();

-1

API를 쉽게 만드는 POSTMAN을 사용할 수 있습니다. 요청 필드를 채우면 다른 언어로 된 코드가 생성됩니다. 오른쪽의 코드를 클릭하고 원하는 언어를 선택하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.