วิธีการใช้งาน PHP curl (Postman)

สวัสดีครับ หลายๆ คนคงเคยได้ ยินคำว่า curl ในภาษา php วันนี้เราจะมาลองใช้ งานมันดูกันนะครับ สมมุติว่าเราต้องดึงข้อมูล Api ระหว่าง server 2 ตัว เราจะทำยังไง ?

Curl สามารถช่วยแก้ปัญหาได้ โดยตัวมันสร้างสามารถสร้าง request RestFul  โดยขั้นตอนการทำงานแบบง่ายคือ

  • curl_init() เพื่อเปิดการทำงาน
  • curl_setopt ( resource $ch , int $option , mixed $value ) เพื่อใส่ option ต่างๆ สำหรับ method post สิ่งที่จำเป็น ก็คือ CURLOPT_URL (url ของ api ที่เราต้องการไปเรียก) , CURLOPT_POSTFIELDS (ข้อมูลที่เราต้องการจะส่งไป) และ CURLOPT_POST (เซตให้เป็น true)
  • curl_exec ( resource $ch ) เพื่อสั่งให้ curl ทำงานคล้ายๆ การกดปุ่ม submit ใน form ที่ client
  • curl_close ( resource $ch ) สุดท้ายคือการสั่งปิดการทำงาน

ด้านล่างคือ source code ที่ใช้สำหรับ ทดสอบโปรแกรม

TestApi.php สร้าง curl สำหรับเรียกใช้งาน

<?php
  $url = 'http://localhost:81/Api/RestfulApi.php'; 
  
  $data = "fn=login&test=1";
  
  /*$data = array(
        'fn' => "login" 
    );*/
  
  
  try{
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $data );
    curl_setopt( $ch, CURLOPT_POST, true );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
    $content = curl_exec( $ch );
    curl_close($ch);
    
    print_r($content);
    
  }catch(Exception $ex){
  
    echo $ex;
  }
    
?>

RestfulApi.php Api ที่เราต้องการเรียกใช้งาน

<?php  

$server = isset($_SERVER['HTTP_HOST'])?isset($_SERVER['HTTP_HOST']):"";
$reqFunction = isset($_POST['fn'])?$_POST['fn']:""; 
$raw  =  isset($HTTP_RAW_POST_DATA)?$HTTP_RAW_POST_DATA  : " POST_DATA  is  null  ";

try{
  switch($reqFunction)
  {
    case 'login';
      $result['status'] = true;
      $result['message'] = "login success" . " test : " . $_POST['test'];
    break;
    default;
      $result['status'] = false;
      $result['message'] = " Unknow command " . $reqFunction. $raw;
    break;
  }
}catch(Exception $ex){
  $result['status'] = false;
  $result['message'] = "exception: ".$ex;
}
    
 echo json_encode($result, JSON_UNESCAPED_UNICODE);

?>

สุดท้ายการสร้าง curl บางครั้งอาจดูยุ่งยาก เพราะต้องกำหนด parameter ต่างๆ ซึ่งมีทั้ง header และ body บางทีก็เขียนผิดเขียน ถูก วันนี้เลยขอแน่ะนำ tools เพื่อใช้ในการเขียน curl ที่เป็น extension ใน chrome ชื่อ postman

จากรูปและในวีดีโอจะเห็นได้ ว่า postman สามารถสร้าง source code ออกมาให้ เราได้เลย ทำให้สะดวกต่อการ ทดสอบ และการเขียนโปรแกรมเพื่อทดสอบการทำงาน ของ api ได้อย่างรวดเร็ว ลองดูนะครับ ผมว่ามีประโยชน์เลยทีเดียว

Cross Domain with JSONP e

เคยไหมกับปัญหาการใช้ Api ข้าม Domain แล้วจะพบว่าไม่สามารถใช้งานได้ เนื่องจาก browser ตรวจสอบแล้วพบว่า ส่วนร้องขอข้อมูลกับส่วนประมวลผลข้อมูลเป็นคนละ domain กัน ดูจากรูปด้านล่าง http://location:81/test/json.html ไปยัง Api ที่อยู่ บน http://localhost:8080/testApi.php จะไม่สามารถแสดงผลได้ เนื่องจากการ Cross domain นั่นเอง

แล้วจะทำอย่างไรถึงจะใช้งานได้ล่ะ ? JSONP เป็นอีกหนึ่งทางเลือก ของการแก้ปัญหานี้ วิธีการนั้นทำได้โดย

  1. โดนรูปแบบของการส่งข้อมูล แทนที่จะเป็น json ธรรมดาก็เปลี่ยนเป็น json พร้อมกับ callback function สามารถทำได้โดยการเพิ่ม option dataType เป็น JSONP และ jsonpCallback ตามด้วยฟังก์ชั่น ที่เราเตรียมไว้ กับ ข้อมูล
  2. ส่ง callback query เพื่อให้ api บน server ทราบชื่อ callback function ที่เราเตรียมไว้ โดยรูปแบบของ json กับ jsonp จะแตกต่างกัน ตามรูปที่แสดง

Code ตัวอย่างด้านล่างนี้นะครับ

json.html :

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>JQuery (cross-domain) JSONP Twitter example</title>
        <script type="text/javascript"src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
        <script>
            $(document).ready(function(){
              
        $('document').ready(function() {
            
          function photos (data) { 
            console.log(data);
          };
      
          var pm_url = 'http://localhost:8080/testApi.php?callback=photos'; 
          $.ajax({
            url: pm_url,
            //type: 'GET',
            success: function(json) {
              $("#data").text(JSON.stringify(json));
              console.dir(JSON.stringify(json));
            },
            error: function(e) {
              $("#data").text(e.message);
               console.log(e.message);
            },
            dataType: 'JSONP',
            jsonpCallback: 'photos',
            //jsonp: 'callback', 
          });
        });
            });
       
      //angular
      var app = angular.module('MyApp', []);
      app.controller('MyCtrl', function($scope, $http) {
        $scope.firstName = "John";
        $scope.lastName = "Doe";
        $scope.colorwheelies = "wait";
        
        $http.jsonp('http://localhost:8080/testApi.php?callback=angular.callbacks._0')
         .success(function(data){
          console.log(data);
          $scope.colorwheelies = data;
          //console.log(data);
          });
          
        $scope.search = function() {
           
        };
      }); 
        </script>
    </head>
    <body  ng-app="MyApp">
        
      Ajax Result :	<span id="data"></span><br/>
     
      <div ng-controller="MyCtrl">
       <p>
        Angularjs result : {{colorwheelies}}
       </p>
      </div> 
    </body>
</html>

testApi.php:

<?php
  
  $callback_fn = isset($_GET['callback'])?$_GET['callback']: 'angular.callbacks._0';
   
  $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
  $result['result'] = $arr;
  
  if(false){
    echo  $callback_fn. "(".json_encode($result).")" ; //for angularjs as default;
    //angular.callbacks._0 ({"result":{"a":1,"b":2,"c":3,"d":4,"e":5}});
  }else{
    echo  json_encode($result) ;
    //{"result":{"a":1,"b":2,"c":3,"d":4,"e":5}};
  }
?>