原文: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. lodash用法系列(1),数组集合操作

    Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.clou ...

  2. 玩android 遇到的问题-2014年1月15日

    1.变态的java工程,不是你点击run,它就run的.  eclipse 默认设置,你选择哪个文件,点击run的时候,就运行哪个文件.够变态不.那么,怎么设置点击run的时候,就运行整个工程呢? 你 ...

  3. webrtc fec

    转自:http://www.cnblogs.com/webrtc/p/7402570.html WebRTC::FEC [TOC] Tags: WebRTC FEC WebRTC中的 FEC 实现分为 ...

  4. pthread_attr_init线程属性

    转自:http://blog.csdn.net/pbymw8iwm/article/details/6721038 1.线程属性 线程具有属性,用pthread_attr_t表示,在对该结构进行处理之 ...

  5. jquery插件--在input下输入密码时提示大写锁定键

    //密码大写输入提示 function capitalTip(id){ $('#' + id).after('<div class="capslock" id="c ...

  6. 转换java keytools的keystore证书到OPENSSL的PEM格式文件

    背景:原先业务使用的前端为haproxy,直接端口转发至tomcat,后端进行ssl连接,所以当时生成的步骤如下 ? 1 2 •生成密钥对:keytool -genkey -alias tomcat- ...

  7. navicat for mysql只导出数据表结构

    选中需要导出表结构的数据库,右键,在显示的菜单中选择“数据传输”这一项 ,在弹出窗口中“数据传输”单击选择“高级”一项,在“高级”中把“记录选项”中的勾去掉,在做一些设置,最后导出表数据就不会导出记录 ...

  8. 使用自定义的Adapter来设置ListView的内容

    这里主要是学习的Adapter的机制 MainActivity.java package com.kale.listview; import android.app.Activity; import ...

  9. COPY ORCHARD GET 404: System.UnauthorizedAccessException: mappings.bin的访问被拒绝

    COPY ORCHARD 得到 404 错误,结果翻看Logs,得到的错误是: 014-07-31 17:36:46,217 [16] Orchard.Environment.DefaultOrcha ...

  10. SVG 文字居中整理

    一.基于SVG文档的文字居中 text-anchor: middle; //水平方向居中 dominant-baseline: middle; //垂直居中 1.使用内联样式配置居中 <svg ...