ZH奶酪:使用PHP调用REST API
原文: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的更多相关文章
- ZH奶酪:Java调用NLPIR汉语分词系统
NLPIR工具 支持自定义词表: 可以离线使用: 下载地址:http://ictclas.nlpir.org/newsdownloads?DocId=389 在线演示:http://ictclas.n ...
- ZH奶酪:JavaScript调用AngularJS的函数/$scope/变量
使用背景: 需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过co ...
- 关于python调用zabbix api接口
因公司业务需要,引进了自动化运维,所用到的监控平台为zbbix3.2,最近正在学习python,计划使用python调用zabbix api接口去做些事情,如生成报表,我想最基本的是要取得zabbix ...
- Unity在Android和iOS中如何调用Native API
本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...
- C#调用windows API的一些方法
使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1. 直接调用从 DLL 导出的函数. 2. ...
- 使用Python调用Flickr API抓取图片数据
Flickr是雅虎旗下的图片分享网站,上面有全世界网友分享的大量精彩图片,被认为是专业的图片网站.其API也很友好,可以实现多种功能.这里我使用了Python调用其API获得了大量的照片数据.需要注意 ...
- WebApi系列~通过HttpClient来调用Web Api接口
回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...
- C#调用Windows API函数截图
界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...
- 以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API
新浪微博的API官方提供了很多种调用方式,支持编程的,归根结底就是两种: 1.基于Oauth协议,使用Open API.(http://open.weibo.com/wiki/%E6%8E%88%E6 ...
- 【转】用C#调用Windows API向指定窗口发送
一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...
随机推荐
- 使用Axure RP原型设计实践03,制作一个登录界面的原型
本篇体验做一个登录界面的原型. 登录页 首先在Page Style里为页面设置背景色. 如果想在页面中加图片,就把Image部件拖入页面,并设置x和y轴.双击页面中的Image部件可以导入图片.在Im ...
- 解决ASP.NET MVC4中使用Html.DropDownListFor显示枚举值默认项问题
从ASP.NET MVC 5开始,Html.DropDownListFor已经提供了对Enum的支持,但在这以前,需要通过帮助方法或扩展方法来让Html.DropDownListFor显示枚举值. 本 ...
- JavaScript进阶系列04,函数参数个数不确定情况下的解决方案
本篇主要体验函数参数个数不确定情况下的一个解决方案.先来看一段使用函数作为参数进行计算的实例. var calculate = function(x, y, fn) { return fn(x, y) ...
- Time Zones And Daylight Savings Time
This page describes code for working with Time Zones and Daylight Savings Time. Neither VBA nor VB6 ...
- Delphi 19种反调试检测法
//使用IsDebuggerPresent这个API来检测是否被调试function FD_IsDebuggerPresent(): Boolean;beginif IsDebuggerPresent ...
- 关于面试总结3-SQL查询
前言 select top n 形式的语句可以获取查询的前几个记录,但是 mysql没有此语法,mysql用limit来实现相关功能. LIMIT子句可以被用于强制 SELECT 语句返回指定的记录数 ...
- SVG.js 引用获取整理
一.SVG.get() 根据id获取元素 var draw = SVG('svg1').size(300, 300); var circle = draw.circle(50); circle.fil ...
- 脚本中export不起作用的原因分析
#!bin/bash export PATH=$PATH:/usr/lib/java/jre export PATH=$PATH:/usr/lib/java/bin ---path 结果发现直接运行. ...
- [转]CENTOS LINUX安装并使用NFS共享文件
FROM :http://www.qiansw.com/centos-linux-nfs.html NFS是linux常用的一种文件分享工具. 下面介绍安装及使用方法. CentOS 5.5 yum ...
- Altium Designer 13 插件安装
关键词:Altium Designer 13 :导入 Protel 99SE 很多人反应Altium Designer 13等版本无法 Protel 99SE的文件,实际上这是由于新的安装机制导致,新 ...