原文:http://yuguo.us/weblog/php-rest-api/

表征状态转移(英文:REpresentational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。

越来越多的公司开放了API,比如腾讯开放平台淘宝开放平台百度开放平台Google Developers等。开放的方式各不相同,有REST和SOAP两种。

REST很容易理解,而且只要是支持HTTP/HTTPS的客户端/服务器就支持它。你可以用HTTP GET方法来执行命令。所以,开发者们感受到的REST的优势是:开发简单、只需依托现有Web基础设施、以及学习成本低。

然而,SOAP作为一种古老的Web服务技术,短期内还不会退出历史舞台。

在我们第三方开发者的PHP应用程序中如果要使用REST API,主要分为两个步骤。一、生成请求。二、处理返回值。

一、生成请求

主要有三种方法来生成一个HTTP请求。

第一种方法就是手动生成请求,使用PHP的header方法。这给了你最大的灵活性,但是需要更多的 编码。

第二种方法是使用PHP内置的file_get_contents()方法或者file()/fopen()/fread()/fclose()方 法,使用这种方法少了一点灵活性,但是代码量非常少。

第三种方法是使用跟API配套的自定义Class,或者叫SDK。如果可以的话,尽量使用第三种方 法,它是最方便的。

手动生成请求

手动生成请求只有在第一次处理的时候才有点棘手,以后的话可以调用方法直接得到结果。此外了解手动生成请求的过程也有助于理解REST和HTTP。

function callAPI($endpoint, $devkey, $action, $type, $keyword)

{

  $action = urlencode($action);

  $type = urlencode($type);

  $keyword = urlencode($keyword);

  $url = $endpoint . "?devkey=$devkey&action=$action&type=$type&keyword=$keyword";

  $url_info = parse_url($url);

  $host = $url_info['host'];

  $path = $url_info['path'] . "?" . $url_info[‘query'];

  $data = "";

  $fp=fsockopen($host, 80);

  fputs($fp, "POST ". $path . "HTTP/1.1\r\n");

  fputs($fp, "Host: ". $host ."\r\n");

  fputs($fp, "Accept: */*\r\n");

  fputs($fp, "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n");

  fputs($fp, "Connection: close\r\n");

  fputs($fp, "Content-Type: application/x-www-form-urlencoded\r\n");

  fputs($fp, "Content-Length: ". strlen($data) . "\r\n\r\n");

  fputs($fp, "$data");

  $response="";

  while(!feof($fp))

  {

    $response.=fgets($fp, 128);

  }

  fclose($fp);

  list($http_headers, $http_content)=explode("\r\n\r\n", $response);

  return $http_content;

}

快速方法(使用PHP的内置方法file_get_contents会让代码量少很多(也少了一些灵活性)。)

function callAPIQuick($endpoint, $devkey, $action, $type, $keyword)

{

  $action = urlencode($action);

  $type = urlencode($type);

  $keyword = urlencode($keyword);

  $url = $endpoint . "?devkey=$devkey&action=$action&type=$type&keyword=$keyword";

  $response = @file_get_contents($url);

  return $response;

}

SDK方法

很多开放平台都会提供各语言的SDK下载,比如淘宝开放平台就提供了java、.net、PHP的SDK,并且还能够根据每个应用的API调用权限进行单独打包。

原文作者没有提到curl方法,这个方法也很方便.

二、处理返回值

返回值要么是JSON格式,要么是XML格式。

如果是XML的话,可以使用PHP5的simplexml来解析。自从PHP 5.2,也已经默认加入了JSON格式的支持。

ZH奶酪:使用PHP调用REST API的更多相关文章

  1. ZH奶酪:Java调用NLPIR汉语分词系统

    NLPIR工具 支持自定义词表: 可以离线使用: 下载地址:http://ictclas.nlpir.org/newsdownloads?DocId=389 在线演示:http://ictclas.n ...

  2. ZH奶酪:JavaScript调用AngularJS的函数/$scope/变量

    使用背景: 需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过co ...

  3. 关于python调用zabbix api接口

    因公司业务需要,引进了自动化运维,所用到的监控平台为zbbix3.2,最近正在学习python,计划使用python调用zabbix api接口去做些事情,如生成报表,我想最基本的是要取得zabbix ...

  4. Unity在Android和iOS中如何调用Native API

    本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...

  5. C#调用windows API的一些方法

    使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1.  直接调用从 DLL 导出的函数. 2. ...

  6. 使用Python调用Flickr API抓取图片数据

    Flickr是雅虎旗下的图片分享网站,上面有全世界网友分享的大量精彩图片,被认为是专业的图片网站.其API也很友好,可以实现多种功能.这里我使用了Python调用其API获得了大量的照片数据.需要注意 ...

  7. WebApi系列~通过HttpClient来调用Web Api接口

    回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...

  8. C#调用Windows API函数截图

    界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...

  9. 以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API

    新浪微博的API官方提供了很多种调用方式,支持编程的,归根结底就是两种: 1.基于Oauth协议,使用Open API.(http://open.weibo.com/wiki/%E6%8E%88%E6 ...

  10. 【转】用C#调用Windows API向指定窗口发送

    一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...

随机推荐

  1. Windows XP UDF 2.5 补丁,播放蓝光ISO光盘必备

    蓝光光盘的文件系统是UDF2.5,Windows XP及以下的操作系统默认不能支持这个文件系统.当我们在XP系统中使用蓝光光盘或蓝光ISO文件时,就会提示“Windows不能从此盘读取,此盘可能已损坏 ...

  2. javascript中{},[]中括号,大括号使用

    一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数. 如:var LangShen = {"Name":"Langshen",&qu ...

  3. iOS 32位、 64位系统兼容性设置-Xcode创建支持IOS4.3以上版本的应用的方法

    方法一: 如果是Xcode 5的话步骤为 点击项目名称->Build Settings->搜索 Architectures 这个里面的原始的值是Standard architectures ...

  4. Linux内核:分析coredump文件 - 内核代码崩溃

    转自:http://blog.csdn.net/guowenyan001/article/details/12975221 一.分析Core文件 1.1 找到core文件目录,启动mycrash:my ...

  5. com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. 解决

    ERROR - No operations allowed after connection closed. 2011-12-07 11:36:09 - ERROR - query failed or ...

  6. java 8 stream特性

    在Java 8的新功能特性中,最棒的特性就是允许我们去表达我们想要完成什么而不是要怎样做.这正是循环的不足之处.要确保循环的灵活性是需要付出代价的.return.break 或者 continue都会 ...

  7. ExtJS 4.2 教程-05:客户端代理(proxy)

    转载自起飞网,原文地址:http://www.qeefee.com/extjs-course-5-client-proxy ExtJS 4.2 教程-01:Hello ExtJS ExtJS 4.2 ...

  8. mysql 内存表

    show variables like 'max_%'; max_heap_table_size 16777216     max_tmp_tables 32     show variables l ...

  9. 数据更新后让ListView自动滚动到底部

    在做聊天界面的时候想要发送新的数据后,listview自动滚动到底部,显示出最新的数据.网上找了两个方法,觉得不错,记录一下. 方法一: 给listview添加下面两个属性 android:stack ...

  10. 使用Python读取Mp3的标签信息

    什么是ID3 MP3是音频文件最流行的格式,它的全称是 MPEG layer III.但是这种格式不支持对于音频内容的描述信息,包括歌曲名称.演唱者.专辑等等. 因此在1996年,Eric Kemp在 ...