PHP में REST API को कॉल करें


317

हमारे क्लाइंट ने मुझे एक REST API दिया था, जिसके लिए मुझे PHP कॉल करने की आवश्यकता है। लेकिन इस तथ्य के रूप में एपीआई के साथ दिए गए प्रलेखन बहुत सीमित हैं, इसलिए मुझे वास्तव में नहीं पता है कि सेवा कैसे कॉल करें।

मैंने इसे Google करने की कोशिश की है, लेकिन केवल एक चीज जो सामने आई है वह पहले से ही समाप्त हो चुकी याहू थी! सेवा को कॉल करने के तरीके के बारे में ट्यूटोरियल। हेडर या गहराई से जानकारी में कुछ भी उल्लेख नहीं।

क्या REST API को कॉल करने के बारे में कोई अच्छी जानकारी है, या इसके बारे में कुछ प्रलेखन है? क्योंकि W3schools पर भी, वे केवल SOAP विधि का वर्णन करते हैं। पीएचपी में बाकी एपीआई बनाने के लिए विभिन्न विकल्प क्या हैं?

जवाबों:


438

आप PHP cURLएक्सटेंशन के साथ किसी भी REST एपीआई का उपयोग कर सकते हैं । हालाँकि, एपीआई प्रलेखन (तरीके, पैरामीटर आदि) आपके ग्राहक द्वारा प्रदान किया जाना चाहिए!

उदाहरण:

// 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
@ मिशैल: HTTP रिक्वेस्ट मेथड (GET, POST, PUT आदि)। एपीआई के आधार पर विभिन्न तरीकों की आवश्यकता होती है। यानी पढ़ने के लिए GET, लिखने के लिए POST।
क्रिस्टोफ विंकलर

2
@ मिचल $dataएक साहचर्य सरणी (डेटा [फ़ील्ड नाम] = मूल्य) है जो एपी विधि को भेजे गए डेटा को रखता है।
क्रिस्टोफ विंकलर

1
आपकी महान सहायता के लिए धन्यवाद!
मिकिएल

2
ध्यान दें, curl_closeफ़ंक्शन को नहीं कहा जाता है, यदि CallAPI फ़ंक्शन को बार-बार कहा जाता है, तो अतिरिक्त मेमोरी खपत का कारण क्या हो सकता है।
बार्ट वेरकोइजेन

1
नीचे @colan से जवाब बेहतर है - यह आपको अपनी त्रुटि हैंडलिंग और आवरण विधियों के निर्माण के साथ पूरी परेशानी से बचाता है।
एंड्रियास

186

यदि आपके पास एक url है और आपका php इसका समर्थन करता है, तो आप file_get_contents को कॉल कर सकते हैं:

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

यदि $ प्रतिक्रिया JSON है, तो इसे php सरणी में बदलने के लिए json_decode का उपयोग करें:

$response = json_decode($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फ़ंक्शन चेतावनी के साथ विफल हो जाता है और अशक्त हो जाता है। यदि शरीर में कोई त्रुटि संदेश है, तो आप उसे पुनर्प्राप्त नहीं कर सकते।
बार्ट वर्कोइजेन

3
इसका मुख्य दोष यह है कि आपके PHP संस्थापन में URL को एक्सेस करने के लिए फोपेन रैपर सक्षम होना चाहिए। यदि फ़ोपेन रैपर सक्षम नहीं हैं, तो आप वेब सेवाओं के अनुरोधों के लिए file_get_contents का उपयोग नहीं कर पाएंगे।
ओरिऑल

2
fopen रैपर PHP के उन हिस्सों में से हैं जिन्हें अब भेद्यता के रूप में देखा जाता है, इसलिए आपको कुछ होस्ट्स को इसे अक्षम करने की संभावना है।
मार्कस डाउनिंग

153

गुझिया का उपयोग करें । यह एक "PHP HTTP क्लाइंट है जो HTTP / 1.1 के साथ काम करना आसान बनाता है और वेब सेवाओं के उपभोग से दर्द को दूर करता है"। गजल के साथ काम करना CURL के साथ काम करने की तुलना में बहुत आसान है।

यहाँ वेब साइट से एक उदाहरण है:

$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 का उपयोग कर रहा है उसने इस विकल्प पर कभी ध्यान नहीं दिया।
जोशुआ डेविड

अच्छा लग रहा है। लेकिन पीएनजी लाने के बारे में क्या? मैप टाइल्स के लिए। मैं केवल आपके द्वारा लिंक किए गए वेब पेज पर उल्लेखित JSON डेटा पा सकता हूं।
हेनरिक एर्लैंडसन

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
अच्छी तरह से @ erm3nda ओपी कह रहा है "तो मैं वास्तव में सेवा को कॉल करने का तरीका नहीं जानता" मुझे REST एपी का उपभोग करने का सबसे अच्छा तरीका नहीं मिला।
ब्रॉन्च

4
वाह, आपने अपनी टिप्पणी को बेहतर बनाने के लिए अपना प्रयास और समय बर्बाद किया। उस तरह से शुभकामनाएँ।
m3nda

2
प्यार कितना सरल है। इसे बनाए रखें
साइबर Oct२००

@ सादिक POST DATA सिर्फ एक स्थान धारक है, आपको अपना पोस्ट डेटा वहाँ भेजना होगा
ब्रोंचा

12

HTTPFUL का उपयोग करें

Httpful एक सरल, श्रव्य, पठनीय PHP लाइब्रेरी है, जिसका उद्देश्य बोलना HTTP साने बनाना है। यह डेवलपर को कर्ल सेट_टॉप पृष्ठों के माध्यम से स्थानांतरित करने के बजाय एपीआई के साथ बातचीत करने पर ध्यान केंद्रित करने देता है और एक आदर्श PHP रेस्ट क्लाइंट है।

Httpful में शामिल हैं ...

  • पठनीय HTTP मेथड सपोर्ट (GET, PUT, POST, DELETE, HEAD और OPTIONS)
  • कस्टम हेडर
  • स्वचालित "स्मार्ट" पार्सिंग
  • स्वचालित पेलोड सीरियल
  • मूल प्रामाणिक
  • क्लाइंट साइड सर्टिफिकेट प्रामाणिक
  • अनुरोध "टेम्पलेट्स"

पूर्व।

GET अनुरोध भेजें। स्वचालित रूप से JSON प्रतिक्रिया प्राप्त करें।

लाइब्रेरी प्रतिक्रिया में JSON सामग्री-प्रकार को नोटिस करती है और स्वचालित रूप से एक देशी 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;जब तक मैं सिर्फ पीएचपी पक्ष गलत कर रहा हूँ
weteamsteve

9

आप जानना चाहते हैं कि बाकी एपीआई आप का समर्थन करता है बुला रहे हैं की आवश्यकता होगी GETया POST, या दोनों तरीकों। नीचे दिया गया कोड कुछ ऐसा है जो मेरे लिए काम करता है, मैं अपनी खुद की वेब सेवा एपीआई कॉल कर रहा हूं, इसलिए मुझे पहले से ही पता है कि एपीआई क्या लेता है और यह क्या लौटेगा। यह दोनों GETऔर POSTविधियों का समर्थन करता है , इसलिए कम संवेदनशील जानकारी अंदर जाती है URL (GET), और उपयोगकर्ता नाम और पासवर्ड जैसी जानकारी POSTचर के रूप में प्रस्तुत की जाती है। इसके अलावा, सब कुछ HTTPSकनेक्शन पर चला जाता है ।

एपीआई कोड के अंदर, मैं एक एरेस को एनकोड करता हूं, जिसे मैं json फॉर्मेट में वापस करना चाहता हूं, फिर echo $my_json_variableक्लाइंट को उस json स्ट्रिंग का लाभ लेने के लिए PHP कमांड का उपयोग करें।

तो जैसा कि आप देख सकते हैं, मेरा एपीआई जोंस डेटा लौटाता है, लेकिन आपको यह जानने की जरूरत है (या यह पता लगाने के लिए लौटाए गए डेटा को देखें) कि एपीआई की प्रतिक्रिया किस प्रारूप में है।

यह है कि मैं क्लाइंट की तरफ से एपीआई से कैसे जुड़ूं:

$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 कॉल विभिन्न तरीकों से सरल http अनुरोध हैं: GET, POST, PUT और DELETE।


4

आप फ़ंक्शन नाम के अनुसार विधि के अलावा, file_get_contentsकिसी भी http POST/PUT/DELETE/OPTIONS/HEADतरीके को जारी करने के लिए उपयोग कर सकते हैं GET

PHP में file_get_contents का उपयोग करके डेटा कैसे पोस्ट करें?


1
file_get_content API के आने पर वास्तव में बुरा विचार है। stackoverflow.com/questions/13004805/… आप फ़ाइल_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

एपीआई के साथ काम करने का यह बिल्कुल नया तरीका है।

सबसे पहले आप एक इकाई को परिभाषित करते हैं जो आने वाले और आने वाले डेटा की संरचना को परिभाषित कर रही है और इसे डेटा स्रोत के साथ एनोटेट करती है:

/*
 * @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

आप POSTMAN के साथ जा सकते हैं, एक ऐसा एप्लिकेशन जो एपीआई को आसान बनाता है। अनुरोध फ़ील्ड भरें और फिर यह आपके लिए विभिन्न भाषाओं में कोड उत्पन्न करेगा। बस दाईं ओर दिए गए कोड पर क्लिक करें और अपनी पसंद की भाषा चुनें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.