วิธีการใช้งาน 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}};
  }
?>

 

Angularjs with Post method

วันนี้ ลองทดสอบ ใช้ Angularjs ส่งผ่าน method POST ไปที่ไฟล์ php บน server ของเรา ปรากฏว่า ไม่มีดาต้าจาก method POST ซะงั้น !!

ทำไม print_r($_POST) ถึงไม่มีข้อมูลอะไรอออกมาเลย แต่กลับมีข้อมูลใน $HTTP_RAW_POST_DATA  แทน ที่เป็นเช่นนี้เพราะอะไร ??

ลองดูตัวอย่าง code นี้จะเห็นได้ว่า Angularjs มีการส่งข้อมูลไปที่ server ด้วย method post แต่ข้อมูลที่ส่งจะมีลักษณะแตกต่างกันไป ตาม headers และการ encrypt data ด้วย หากต้องการให้ $_POST สามารถดักจับข้อมูลได้ ก็ต้อง แก้ไข header เป็น headers: { ‘Content-Type’: ‘application/x-www-form-urlencoded’} และ encrypt ฟังก์ชั่นด้วย   $httpParamSerializerJQLike สามารถดูรายละเอียดสามารถดูได้จาก  https://docs.angularjs.org/api/ng/service/$httpParamSerializerJQLike

index.php

 

<div ng-app="myApp" ng-controller="myCtrl">
  post_id : <input value="test" name="test"  ng-model="createModel.post_id" /> 
  post_name: <input value="test2222" name="test3342" ng-model="createModel.post_name" /><input type="button" ng-click="saveData()" name="senddata" value="senddata"> 
  
  <div><p> post : {{ response.post }}</p></div> 
  <div><p> post_raw_data : {{ response.post_raw_data }}</p></div> 
  <div><p> send_data : {{ response.send_data }}</p></div> 
  
</div>

<script src="angular.js"></script>
<script type="text/javascript">
  
   
    var app = angular.module('myApp', []);
    app.controller('myCtrl', function($scope, $http, $httpParamSerializerJQLike) {
        
        $scope.bCreate = false;
        $scope.bSearch = false;
        $scope.bResultTable = true;
        $scope.createModel = { 	post_id:'1', post_name:"test" };
        $scope.response = {post:'', post_raw_data:"", send_data:"" } 
        
        $scope.saveData = function() {
        //alert('saveData');
            $scope.bCreate = false;
        	$scope.bSearch = false;
        	$scope.bResultTable = true;
        	
        	console.log( $scope.createModel );
        	
        	$http({
              url: "addPostName.php",
              method: "POST",
          data: $httpParamSerializerJQLike($scope.createModel), //comment1
          //data: $scope.createModel,
          //data:   JSON.stringify($scope.createModel),  
          //headers: { 'Content-Type': 'application/x-www-form-urlencoded'} //comment1
          //headers: { 'Content-Type': 'application/json' }
          })
          .then(function(response) {
          $scope.response.post = response.data.POST;
          $scope.response.post_raw_data = response.data.HTTP_RAW_POST_DATA;
          $scope.response.send_data = response.data.DATA;
          	console.log(response);
                  // success
          }, 
          function(response) { // optional
          	console.log(response);
                  // failed
          });
        } 
    });  

</script>

addPostname.php

<?php  
    $result['POST'] =  isset($_POST['post_id'])?$_POST['post_id']: "POST is null  ";
     
    $result['HTTP_RAW_POST_DATA'] =  isset($HTTP_RAW_POST_DATA)?$HTTP_RAW_POST_DATA  : " POST_DATA  is  null  ";
     
    
    //echo " param " . $.param;
    
    if (isset($HTTP_RAW_POST_DATA  ))
      $result['DATA']  =  $HTTP_RAW_POST_DATA ;// $this->input->post('message');	 
    else
      $result['DATA']   = $_POST;
    
      echo json_encode( $result );

?>

รูปนี้ แสดงให้เห็นว่าถ้าเปลี่ยน headers type ดาต้าก็ที่ส่งขึ้น server ก็จะเปลี่ยนตามไปด้วย

การใช้งาน Codeigniter บน IIS Window Azure

การใช้งาน Codeigniter บน IIS  สิ่งสำคัญคือ route method ซึ่งโดยปกติแล้ว จะใช้งานได้ บน hosting ที่เป็น Apache โดยไม่ต้อง config อะไร แต่สำหรับ window azure หรือ IIS แล้วจะต้องมีการแก้ไขไฟล์   web.config เพื่อทำการ rewrite url เมื่อต้องการใช้งานจึงมีสิ่งที่ต้องทำ 2 อย่าง เพื่อให้ iis มีการ rewrite เหมือน .htaccess ใน appserv คือ

  •  install urlrewrite ตามตัวอย่าง ใน clip
  • สร้างไฟล์ web.config เพื่อใช้แทน ไฟล์ .htaccess

ตัวอย่างไฟล์ web.config เพื่อการ rewrite

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
      <rule name="Index">
        <match url="^(.*)$"/>
        <conditions>
          <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
          <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
        </conditions>
        <action type="Rewrite" url="index.php/{R:1}"/>
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

ติดตั้ง IIS PHP MYSQL บน window7

ติดตั้ง IIS PHP MYSQL  บน window7

ขั้นตอนการติดตั้ง IIS + PHP + MYSQL บน window7 สามารถทำได้ง่ายๆ เริ่มจากการติดตั้ง IIS โดยทำการเปิด window feature  ตามภาพข้างล่าง

console panel -> program -> window fearue -> internet information services (IIS)

หลังจากติดตั้ง IIS เรียบร้อยแล้ว ให้ download web platform installer program ซึ่งสามารถ donwload ได้จาก microsoft

เมื่อติดตั้งเสร็จ สามารถเปิดจาก IIS manager แล้ว double click icon web platform installer พิมพ์ คำว่า “php” กด enter จะแสดงรายที่เกี่ยวข้อง ให้เลือก php เวอร์ชั่นที่ต้องการ และยังสามารถได้ หลาย version พร้อมกันอีกด้วย

เมื่อตั้งเสร็จแล้ว IIS Manager จะมี icon เพิ่มขึ้นมาตามรูป

ทำการติดตั้ง mysql ได้โดยการเรียกใช้ web platform installer เช่นเดียวกันขั้นตอนการติดตั้ง php

จะเห็นได้ว่าการติดตั้ง php และ mysql สามารถ ทำได้งานขึ้นผ่านโปรแกรม web platform installer