পিএইচপি-তে একটি REST এপিআই কল করুন


317

আমাদের ক্লায়েন্ট আমাকে একটি REST এপিআই দিয়েছে যার সাথে আমার একটি পিএইচপি কল করা দরকার। তবে প্রকৃতপক্ষে এপিআই দিয়ে দেওয়া ডকুমেন্টেশন খুব সীমাবদ্ধ, তাই আমি কীভাবে পরিষেবাটি কল করতে পারি তা জানি না।

আমি এটি গুগলে চেষ্টা করেছি, তবে একমাত্র বিষয়টি যা ইতিমধ্যে শেষ হয়ে গেছে ইয়াহু! কিভাবে পরিষেবা কল করতে টিউটোরিয়াল। গভীরতার তথ্যে শিরোনাম বা কিছু উল্লেখ না করে।

কীভাবে কোনও আরএসটি এপিআই কল করা যায় তার চারপাশে কোনও শালীন তথ্য, বা এটি সম্পর্কে কোনও ডকুমেন্টেশন রয়েছে? এমনকি ডাব্লু 3 স্কুলগুলিতে এমনকি তারা কেবল এসওএপি পদ্ধতি বর্ণনা করে। পিএইচপিতে রেস্ট এপিআই করার বিভিন্ন বিকল্প কী কী?

উত্তর:


438

আপনি পিএইচপিএস 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
@ মিচিয়েল: এইচটিটিপি অনুরোধের পদ্ধতি (জিইটি, পোস্ট, পুট ইত্যাদি)। এপিআই উপর নির্ভর করে বিভিন্ন পদ্ধতি প্রয়োজন। অর্থাত্ পাঠের জন্য জিইটি, লেখার জন্য পোস্ট করুন।
ক্রিস্টোফ উইঙ্কলার 22'12

2
@ মিচিয়েল $dataহ'ল একটি সহযোগী অ্যারে (ডেটা [ক্ষেত্রের নাম] = মান) যা এপিআই পদ্ধতিতে প্রেরিত ডেটা ধারণ করে।
ক্রিস্টোফ উইঙ্কলার

1
আপনার দুর্দান্ত সহায়তার জন্য ধন্যবাদ!
মিশিগেল

2
দ্রষ্টব্য, curl_closeফাংশনটি কল করা হয় না, যদি কল্যাপআই ফাংশনটি বারবার বলা হয় তবে অতিরিক্ত মেমরির খরচ হতে পারে।
বার্ট ভার্কোইজেন

1
নীচে @ কোলান থেকে উত্তরটি আরও ভাল - এটি আপনার নিজের ত্রুটি পরিচালনা ও মোড়ক পদ্ধতি তৈরির মাধ্যমে আপনাকে পুরো ঝামেলা বাঁচায়।
Andreas

186

আপনার যদি একটি url থাকে এবং আপনার পিএইচপি এটি সমর্থন করে, আপনি কেবল ফাইল_জেট_কন্টেন্টগুলি কল করতে পারেন:

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

যদি $ প্রতিক্রিয়াটি JSON হয় তবে পিএইচপি অ্যারেতে রূপান্তর করতে json_decode ব্যবহার করুন:

$response = json_decode($response);

যদি $ প্রতিক্রিয়াটি এক্সএমএল হয়, সরল_ এক্সএমএল শ্রেণি ব্যবহার করুন:

$response = new SimpleXMLElement($response);

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


30
যদি REST এন্ডপয়েন্টটি কোনও HTTP ত্রুটি স্থিতি (যেমন 401) file_get_contentsফিরিয়ে দেয় তবে ফাংশনটি একটি সতর্কতা দিয়ে ব্যর্থ হয় এবং শূন্য ফিরে আসে। যদি শরীরে কোনও ত্রুটি বার্তা থাকে তবে আপনি এটি পুনরুদ্ধার করতে পারবেন না।
বার্ট ভার্কোইজেন

3
এর প্রধান ত্রুটিটি হ'ল URL টি অ্যাক্সেস করার জন্য আপনার পিএইচপি ইনস্টলেশনটি অবশ্যই ফোপেন র‌্যাপারগুলি সক্ষম করে থাকতে পারে। যদি ফোপেন মোড়কগুলি সক্ষম না করা হয় তবে আপনি ওয়েব পরিষেবাদির অনুরোধগুলির জন্য ফাইল_জেট_কন্টেন্টগুলি ব্যবহার করতে সক্ষম হবেন না।
ওরিওল

2
ফোপন র‌্যাপারগুলি এখন পিএইচপি-র অংশগুলির মধ্যে অন্যতম, যা এখন দুর্বলতা হিসাবে দেখা হয়, সুতরাং আপনি সম্ভবত কিছু হোস্টকে এটি অক্ষম করতে দেখবেন।
মার্কাস ডাউনিং

153

গুজল ব্যবহার করুন । এটি একটি "পিএইচপি এইচটিটিপি ক্লায়েন্ট যা এইচটিটিপি / ১.১ এর সাথে কাজ করা সহজ করে এবং ওয়েব পরিষেবাদি ব্যবহারের ব্যথার বাইরে নিয়ে যায়"। গুজলের সাথে কাজ করা সিআরএল এর সাথে কাজ করার চেয়ে অনেক সহজ।

ওয়েব সাইট থেকে এখানে একটি উদাহরণ দেওয়া হয়েছে:

$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
যে এখনও সিআরএল ব্যবহার করছে সে কখনই এই বিকল্পটি ঘনিষ্ঠভাবে দেখেনি।
জোশুয়া ডেভিড

ভালই লাগছে. তবে পিএনজি আনার কী হবে? মানচিত্র টাইলস জন্য। আপনার লিঙ্ক করা ওয়েব পৃষ্ঠায় আমি কেবলমাত্র জেএসএন ডেটা খুঁজে পেতে পারি।
হেনরিক এরল্যান্ডসন

20

URL যাওয়ার সহজ উপায় হ'ল সিআরএল। এখানে একটি সহজ কল

$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 ওপি বলছে "তাই আমি কীভাবে পরিষেবাটি কল করতে জানি না" আমাকে একটি রিস্টের এপিআই গ্রাস করার সর্বোত্তম উপায়টি পাবেন না।
ব্রোঞ্চা

4
বাহ, আপনি আপনার মন্তব্যটি আরও ভাল করার পরিবর্তে আমাকে আপনার মজাদার জবাব দেওয়ার জন্য আপনার প্রচেষ্টা এবং সময় নষ্ট করছেন। শুভকামনা সেই পথে।
m3nda

2
এটি কতটা সহজ ভালবাসুন। এটি চালিয়ে যান
সাইবার 8200

@ সাদিক পোস্টের ডেটা কেবলমাত্র একটি স্থানধারক, আপনার সেখানে আপনার পোস্টের ডেটা প্রেরণ করতে হবে
ব্রোঞ্চা

12

HTTPFUL ব্যবহার করুন

এইচটিপিফুল একটি সহজ, শৃঙ্খলাবদ্ধ, পঠনযোগ্য পিএইচপি লাইব্রেরি যা স্পিচ এইচটিটিপি বুদ্ধিমান করে তোলে। এটি বিকাশকারীকে কার্ল সেট_পুট পৃষ্ঠাগুলির মাধ্যমে পাল্টানোর পরিবর্তে এপিআইয়ের সাথে কথোপকথনের দিকে মনোনিবেশ করতে দেয় এবং এটি একটি আদর্শ পিএইচপি রেস্ট ক্লায়েন্ট।

এইচটিপিফুলের মধ্যে রয়েছে ...

  • পঠনযোগ্য এইচটিটিপি পদ্ধতি সমর্থন (জিইটি, পুট, পোস্ট, মুছে ফেলুন, মাথা এবং বিকল্পগুলি)
  • কাস্টম শিরোনাম
  • স্বয়ংক্রিয় "স্মার্ট" পার্সিং
  • স্বয়ংক্রিয় পেডলোড সিরিয়ালাইজেশন
  • বেসিক আথ
  • ক্লায়েন্ট সাইড শংসাপত্র প্রমাণীকরণ
  • "টেমপ্লেট" অনুরোধ করুন

যাত্রা।

একটি জিইটি অনুরোধ প্রেরণ করুন। স্বয়ংক্রিয়ভাবে JSON প্রতিক্রিয়া পার্স করুন।

লাইব্রেরিটি প্রতিক্রিয়াতে JSON সামগ্রী-প্রকারটি লক্ষ্য করে এবং স্বয়ংক্রিয়ভাবে প্রতিক্রিয়াটিকে একটি স্থানীয় পিএইচপি বস্তুতে পার্স করে।

$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 ব্যবহার করার চেষ্টা করছি এবং আমি নিশ্চিত নই যে এটি জসনকে পার্স করতে পারে $condition = $response->weather[0]->main;যদি না আমি কেবল পিএইচপি
পাশটি

9

আপনার জানা দরকার যে আপনি যে REST এপিআই কল করছেন সেগুলি GETবা POST, বা উভয় পদ্ধতিই নয়। নীচের কোডটি এমন কিছু যা আমার পক্ষে কাজ করে, আমি আমার নিজের ওয়েব সার্ভিস এপিআই কল করছি, তাই আমি ইতিমধ্যে জানি যে এপিআই কী নেয় এবং এটি কী ফিরে আসবে। এটি উভয় GETএবং POSTপদ্ধতিই সমর্থন করে, তাই সংবেদনশীল তথ্যগুলি কম intoুকে যায় এবং URL (GET)ব্যবহারকারীর নাম এবং পাসওয়ার্ডের মতো তথ্য POSTভেরিয়েবল হিসাবে জমা দেওয়া হয় । এছাড়াও, সবকিছু HTTPSসংযোগের ওপরে চলে যায় ।

এপিআই কোডের অভ্যন্তরে আমি একটি অ্যারে এনকোড করে আমি জসন ফর্ম্যাটে ফিরে যেতে চাই, তারপরে কেবল পিএইচপি কমান্ডটি ব্যবহার করি echo $my_json_variable ক্লায়েন্টের কাছে সেই জসন স্ট্রিংটি অ্যাভায়লাব করতে করুন।

সুতরাং আপনি দেখতে পাচ্ছেন, আমার এপিআই জসন ডেটা ফেরত দেয়, তবে আপনাকে এপিআই থেকে প্রতিক্রিয়াটি কোন ফর্ম্যাটটিতে রয়েছে তা জানতে (বা এটি জানতে ফিরে আসা ডেটার দিকে নজর দেওয়া) দরকার।

এইভাবে আমি ক্লায়েন্টের পক্ষ থেকে এপিআইয়ের সাথে সংযুক্ত:

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

বিটিডাব্লু, আমি file_get_contents()এখানকার কিছু ব্যবহারকারীর পরামর্শ অনুসারে পদ্ধতিটিও ব্যবহার করার চেষ্টা করেছি , তবে তা আমার পক্ষে ভাল কাজ করে না। আমি curlপদ্ধতিটি দ্রুত এবং আরও নির্ভরযোগ্য হওয়ার জন্য খুঁজে পেয়েছি ।


5

আসলে প্রচুর ক্লায়েন্ট রয়েছে। এর মধ্যে একটি কীটপতঙ্গ - এটি পরীক্ষা করে দেখুন। এবং মনে রাখবেন যে এই REST কলগুলি বিভিন্ন পদ্ধতির সাথে সাধারণ http অনুরোধ: জিইটি, পোস্ট, পুট এবং মুছুন।


4

ফাংশনটির নাম অনুসারে পদ্ধতিটি ছাড়াও আপনি file_get_contentsকোনও HTTP POST/PUT/DELETE/OPTIONS/HEADপদ্ধতি জারি করতে ব্যবহার করতে পারেন GET

ফাইল_জেট_কন্টেন্টস ব্যবহার করে কীভাবে পিএইচপি তে ডেটা পোস্ট করবেন?


1
ফাইল_জেট_কন্টেন্টটি এপিআই-তে আসার পরে সত্যই খারাপ ধারণা। stackoverflow.com/questions/13004805/… আপনি file_get_contents_curl এর মতো কাস্টম পদ্ধতি সেট করতে পারেন এবং এটি সরল পিএইচপি সমাধানের পরিবর্তে ব্যবহার করতে পারেন। stackoverflow.com/questions/8540800/…
এরিক র্রবেল

3

আপনি যদি সিমফনি ব্যবহার করছেন তবে একটি দুর্দান্ত বিশ্রামের ক্লায়েন্ট বান্ডেল রয়েছে যা এমনকি ~ 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

@ ক্রিসটফ উইঙ্কলার যেমন উল্লেখ করেছেন এটি এটি অর্জনের জন্য এটি একটি বেস ক্লাস:

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

আরআরএসটি এপিআইয়ের সাথে যোগাযোগ করা এখন বেশ সহজ:

$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

আপনি পোষ্টম্যানের সাথে যেতে পারেন, এমন একটি অ্যাপ্লিকেশন যা এপিআইগুলিকে সহজ করে তোলে। অনুরোধ ক্ষেত্রগুলি পূরণ করুন এবং তারপরে এটি আপনার জন্য বিভিন্ন ভাষায় কোড উত্পন্ন করবে। ডান পাশের কোডটি ক্লিক করুন এবং আপনার পছন্দসই ভাষাটি নির্বাচন করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.