导航:首页 > 编程语言 > phprestapi实例

phprestapi实例

发布时间:2022-10-01 10:46:58

⑴ 如何更好地设计REST API

由于REST可以降低开发的复杂度,提高系统的可伸缩性,增强系统的可扩展性,简化应用系统之间的集成,因而得到了广大开发人员的喜爱,同时得到了业界广泛的支持。比如IBM,Google等公司的很多产品都提供了REST API给开发人员;与此同时,大量的开源项目和云计算服务都提供了REST API接口。

而在最近,一些新产品的开发甚至已经几乎完全抛弃了传统的类似JSP的技术, 转而大量使用REST风格的构架设计, 即在服务器端所有商业逻辑都以REST API的方式暴露给客户端, 所有浏览器用户界面使用widget、Ajax、HTML5 等技术,用HTTP的方式与后台直接交互。

那么, 在REST API爆炸式增长的今天, 我们应该如何更好的设计我们的接口, 来提高我们的API的可用性,易用性,可维护性与可扩展性呢?本文将从以下方面与您探讨REST API设计方面的最佳实践:

如何规划资源标识结构与URI模式
如何根据应用场景提供内容协商
如何正确的使用HTTP响应代码
如何处理缓存和并发请求
如何利用数据冗余和链接元素
先决条件

如果您具有如下知识与经验,将有助于您阅读和理解本文章的内容 。

REST相关的基本知识;
HTTP协议的基本知识;
一定的Web开发经验。
REST简介

REST是英文Representational State Transfer的缩写,是近年来迅速兴起的,一种基于HTTP、URI以及XML这些现有协议与标准的,针对网络应用的设计和开发方式。它可以降低开发的复杂度,提高系统的可伸缩性。

REST的核心是可编辑的资源及其集合,用符合Atom文档标准的Feed和Entry表示。每个资源或者集合有一个惟一的URI。系统以资源为中心,构建并提供一系列的Web服务。REST的基本概念和原则包括:系统上的所有事物都被抽象为资源;每个资源对应唯一的资源标识;对资源的操作不会改变资源标识本身;所有的操作都是无状态的;等等。

在REST中,开发人员显式地使用HTTP方法,对系统资源进行创建、读取、更新和删除的操作:

使用POST方法在服务器上创建资源
使用GET方法从服务器检索某个资源或者资源集合
使用PUT方法对服务器的现有资源进行更新
使用DELETE方法删除服务器的某个资源

图 1. 用 HTTP 方法操作相册系统资源的简单范例

更好的规划你的资源标识结构与URI模式

REST 中,最基本的莫过于资源标识结构和URI模式了。更好的规划他们,是我们的API设计取得成功的最关键的一步。

首先,我们来看看基本资源类型

上文中提到,在REST构架的设计中,系统中的所有事物都被抽象为资源。

在一个文档系统中,文档、目录、注释、草稿等等,是组成系统的资源。

在一个银行系统中,客户信息、理财产品、利率信息、网点信息等等,是组成系统的资源。

在一个航空客票系统中,旅客信息、机票订单、航班信息、机场信息等等,是组成系统的资源。

这些资源,通常在系统中以“Entry”的形式出现。下面的代码样例向您展示了一个常见的“Entry”资源。

清单 1. 一个简单的Entry资源样例

以下是引用片段:
REST API 请求:
GET http://example.com/航班信息/CA827/entry
<entry>
<id> CA827 </id>
<link href="航班信息 /CA827/entry" rel="self"/>
<title type="text">CA827 </title>
<published>2010-08-24T02:35:40.937Z </published>
<updated>2010-08-24T02:35:40.937Z </updated>
<ca:from>Beijing </ca:from>
<ca:to>Changsha </ca:to>
<ca:time>09:30:00 </ca:time>
<ca:aircraft>AB330 </ca:aircraft>
<summary type="text"/>
</entry>

我们会注意到,这些资源,在描述了某种事物的同时,还有可能存在一定的层次结构关系。比如,文档从属于某个目录,注释从属于文档;旅客信息可以从属于机票订单,也可以从属于某个航班。

当我们的资源有这种层次关系的时候,我们不妨在URI模式的设计中,用复合的URI来帮助开发者更好的理解和设计资源。

比如, 针对一个文档的评论, 他的URI模式可以设计成如下:/文件夹/[文件夹名]/文件/[文件名]/评论/[ 评论唯一标示 ]。 这样,在构造和解析URI的过程中, 可以帮助开发者更好的理解系统,设计程序。

其次,我们来看看集合资源类型

资源,除了作为独立个体可以被访问,还可以由多个个体组合成一个集合,在系统中,通常以“feed”的形式存在。资源的集合, 可以是处于相同层次上,有相同从属关系的一组资源,比如一个文件夹下的所有文件; 也可以是根据某种条件查询出来的查询结果的资源集合,比如所有30岁以上40岁以下,拥有100万资产以上客户的名单。

下面,我们来讨论一下设计集合类型资源的REST API时需要考虑的问题。

使用过滤条件来帮助用户更准确地获取数据

我们要返回的资源集合,无论是否有相同从属关系,大部分时候都需要进行必要的过滤,提供足够的过滤参数,查询参数, 能够帮助开发者高效的,准确地获取所需要的数据。 在服务器端过滤数据通常比客户端高效,并且减少了不必要的数据传输,可以大大减少网络开销,提高执行效率。

最常见的过滤条件,是通过URL参数实现,比如/环境工程系/学生? 籍贯=北京&性别=女。

很多时候,我们需要制定更加复杂的过滤条件,那么我们可以有两种选择:

首先,我们可以使用正则表达式或者服务器可以理解的语法,比如/环境工程系/学生?filter=age between (15, 18)

其次,我们还可以使用POST方法,携带一个文件来描述复杂的查询条件,文件的格式与语法通常需要在服务器端有相应的设计与定义。不过通常POST方法没有缓存机制,因此不是查询数据的首选。

使用排序来帮助客户端更好的展现数据

虽然进行客户端排序对于开发者来说是件轻而易举的事情,但是直接得到已经排序的返回结果,仍然是大部分开发者所期望的。尤其是很多时候,我们在浏览器,使用 Widget 展示结果,不适宜在客户端存储大量数据进行内存排序。

排序, 通常有2个参数,一个是用来排序的字段,一个是排序的升序降续方式。比如我们可以用支持这样的参数组合的手段,提供基本的排序能力:?sortOrder=asc&sortField=age

使用分页来帮助客户端处理大量数据

由于返回的结果可能有几百几千条记录,将这些记录一次性的返回给客户端是不现实的,巨大的网络流量开销和客户端数据区的内存开销,都是我们在应用开发的时候不希望看到的,因此,如果你的集合资源有可能有大量的数据返回,请务必提供分页的功能支持。

我们通常用一个以上参数来制定一个返回结果的区域,比较常见的有下面两种:

一种常见于用固定行数的表格来展示数据,用当前处于第几页和每页返回多少行数据来确定需要的数据, 比如/所有学生?page=5&pagesize=50

另外一种常见于用更加灵活的界面展示数据,用从第几行开始,一共返回多少行数据来确定需要的数据, 比如/所有学生?startIndex=27&count=22

下面是一个来自IBM developerWorks的API样例,尝试请求该API,你可以看到该集合很好的支持了结果的分页与排序。同时我们从返回的信息中可以看到,每个文档Entry的URI都按照/社区库/[社区库ID]/文档/[文档ID]的复合URI的模式设计的。

清单 2. IBM developerWorks的某个社区文件库的集合资源的API

以下是引用片段:
REST API 请求:
GET https://www.ibm.com/developerworks/mydeveloperworks
/files/form/anonymous/api/communitylibrary
/0a7c97bb-6cf9-4ddb-a918-80994e7b444d/feed?
pageSize=5&page=1&sK=modified&sO=dsc

最后,我们来讨论一些特殊资源类型

理想的REST世界,一切事物都抽象为资源,一切操作都抽象为增删改查。然而,所有事物与操作都可以很容易的按照这个规则作抽象吗?让我们看看这个例子:

检入和检出一个文档----这个时候,我们要处理的资源是一个文档,然而增删改查似乎都无法与“检入检出”这个动作进行对应。当然,我们可以在文档资源中,设计一个检入检出状态的元素,通过编辑文档资源来实现。但是,这种设计从自然语义上看,并不是很贴切;并且增加了资源编辑操作的复杂度。

如果我们来定义一个新的集合----“我检出的文档”,用创建一个集合资源来对应检出(创建一个文档锁),用删除一个集合资源来对应检入(删除一个文档锁), 是不是逻辑上可以变得更加清楚?

在REST这个以名词为核心的构架结构中,当你遇到一些动词特性比较强的操作,而又很难用原始资源的增删改查来匹配的时候,不妨换个思路, 通过引入新的逻辑资源集合的方式, 来进行API的设计与规划。

理解和使用内容协商

我们的开发者在发送一个REST API请求的同时,根据应用场景,针对相同的资源,可能会期待不同的返回形式。

比如,我希望根据用户客户端语言,同一个资源的内容可以返回不同的语言。又比如,当我使用Java编程的时候,我希望得到ATOM格式的返回结果,而当我使用JavaScript编程的时候,我希望得到Json格式的返回结果。

因此,我们在设计REST API的时候,应该提供完备的内容协商能力。

使用URL参数进行内容协商

最容易想到的自然是通过URL参数进行控制,我们经常看到形如/航班号/entry? format=JSON这样的URL。这种方式的优势就是简单灵活, 你可以通过任何 URL 参数来组合你的输出格式。

下面是一个来自IBM developerWorks的API样例,尝试请求该API,你可以看到该集合是如何支持不同的输出格式请求的。

清单 3. IBM developerWorks的文件服务标签云的API

以下是引用片段:
REST API请求,要求返回XML格式数据:
GET https://www.ibm.com/developerworks/mydeveloperworks
/files/form/anonymous/api/tags/feed?format=xml
&scope=document&pageSize=30&sK=cloud&sO=dsc
REST API请求,要求返回JSON格式数据:
GET https://www.ibm.com/developerworks/mydeveloperworks
/files/form/anonymous/api/tags/feed?format=json
&scope=document&pageSize=30&sK=cloud&sO=dsc

使用Accept头进行内容协商

使用URL参数,简单灵活,但是也由此带来了设计上的随意和不标准。并且,过多的参数会导致URL的可读性变差,更有甚者,可能会导致URL过长,超出规范,API请求无法执行。

更为标准的内容协商方式是使用HTTP头。我们通常使用Accept来设置我们接受的返回结果的内容格式,用Accept-Charset来设置字符集,用Accept-Encoding来设置数据传输格式,用Accept-Language来设置语言。

使用URI模式进行内容协商

还有一种模式,就是将协商设置直接作为URI的一部分,将不同的返回视为不同的资源,比如/航班号/json来返回JSON格式的结果,用/航班号/atom来返回ATOM格式的结果。

正确的使用HTTP响应代码

作为API的设计者,正确的将API执行结果和失败原因用清晰简洁的方式传达给客户程序是十分关键的一步。 我们确实可以在HTTP的相应内容中描述是否成功,如果出错是因为什么, 然而, 这就意味着用户需要进行内容解析,才知道执行结果和错误原因。因此,HTTP响应代码可以保证客户端在第一时间用最高效的方式获知API运行结果,并采取相应动作。

转载,仅供参考,祝你愉快,满意请采纳。

php怎么开发rest api

“表面看来,良好的REST API很简单,即使后端很复杂,” Hazlewood在一次采访说到。一个 API 关注一系列的东西,以及如何表现个人的东西。减少API集合,搜索所有书籍和出版刊物,你会发现一个简洁的解决方案,它很直观,且不是太复杂。

⑶ 什么是REST API请解释的通俗一点,它和一般的API有什么区别

REST API是一组关于如何构建Web应用程序API的架构规则、标准或指导,REST API遵循API原则的架构风格。REST是专门针对Web应用程序而设计的,其目的在于降低开发的复杂度,提高系统的可伸缩性。

REST API和一般的API区别为:包含不同、资源不同、状态不同。

一、包含不同

1、REST API:REST API 是API的子集;所有的REST API都是API。

2、一般的API:一般的API的为。API是REST API的超集,不是所有的API都是REST API。

二、资源不同

1、REST API:在REST API架构中,每一个资源都有与之对应的唯一资源标识符(resource identifier),当资源的状态发生改变时,资源标识符不会发生改变。

2、一般的API:一般的API架构中,Web中所有的事物(文本、音频、视频、图片、链接)被统一的抽象为资源(resource)。当资源的状态发生改变时,资源标识符会发生改变。

三、状态不同

1、REST API:在REST架构中,所有的操作都是无状态的。REST架构不遵循CRUD原则。

2、一般的API:一般的API架构中,所有的操作都是有状态的。遵循CRUD原则,所有的资源都可以通过GET、POST、PUT和DELETE这四种行为完成对应的操作。

⑷ 怎么用PHP开发API供其他客户端调用

一、接口的分类:

1、URL类型的接口
URL
路由带参数式的接口!这个很好做!只要有过Web开发经验的人都能完成!这种接口数据不够隐蔽性,可以直接在浏览其中看到,如支付宝的交易请求URL。需
要加一个MD5签名,和服务器端的再次向支付宝服务器发送验证!虽然soap方式传递的数据隐蔽性很好!但为了数据安全,难免也需要进行数据签名。

2、SOAP类型的接口
无关编程语言、无关平台、扩展性很好,要实现一个SOAP 型的接口,有两种方式:一种有WSDL文件方式、一中无WSDL文件方式!

于热爱研究型的人来说,使用第一种方式可以让你清楚的了解PHP是怎么创建了一个Web
Service!但第一种对于新手来说,创建一个XML格式的WSDL文件,是比较难的,这你的先了解熟悉什么是XML!学会XML语法!但对于一个急于
解决问题的人来说!没有这么多的时间去熟悉!所以这是件烦恼的事!

二、PHP环境设置
先配置下PHP的soap环境支持:
找到php.ini文件
;extension=php_soap.dll
删除掉";" ,重启apache服务器
为了便于测试,需要关于wsdl缓存
方式1:
配置文件:php.ini 选项 soap.wsdl_cache_enabled 设置为0
方式2:
代码头添加:ini_set('soap.wsdl_cache_enabled', "0"); //关闭wsdl缓存

三、有WSDL文件方式创建

这里先介绍标准的webservice。 那么如何创建wsdl呢?对于PHP来说这确实是件很不容易的事情,有人说用zend
studio创建很方便,这是一种方法。但对于那些不喜欢用zend studio的人来说,会觉得创建一个web service还要安装zend
studio,太强人所难了。
在这里介绍一个简单的方法,到网上下载SoapDiscovery.class.php类,里面有个公用方法:getWSDL,这个方法末尾是用的 return,那么,你修改一下这个方法:
//return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>');
//生成wsdl文件,将上面的return注释
$fso = fopen($this->class_name . ".wsdl" , "w");
fwrite($fso,
sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL,
$serviceWSDL, $messageWSDL, '</definitions>'));
现在生成wsdl的类有了,SoapDiscovery.class.php(源码在最末尾)。

再准备一个提供服务的Service.php类文件或者函数就可以创建wsdl了!

⑸ PHP网站提供API服务

网站上的API接口就是在别的网站上使用一组代码,调用提供接口网站的内容,如一个普通的iframe嵌入式框架代码可以显示一个网站提供的工具,别的网站通过添加这个代码,就可以在自己的网站上使用显示这个工具,如http://www.into123.cn

⑹ php根据经纬度获取地理位置

这种功能,只能调用第三方的接口了,网络地图API就有这个接口addressComponents,逆地址解析,参考方法如下:

<GeocoderSearchResponse>

<status>OK</status>

<result>

<location>

<lat>38.990998</lat>

<lng>103.645966</lng>

</location>

<formatted_address>甘肃省武威市民勤县</formatted_address>

<business/>

<addressComponent>

<streetNumber/>

<street/>

<district>民勤县</district>

<city>武威市</city>

<province>甘肃省</province>

</addressComponent>

<cityCode>118</cityCode>

</result>

</GeocoderSearchResponse>

⑺ 求php实现rest的api原理(json)

简单说就是利用curl或者fsocket等函数封装http请求,并将对应response抓取回来后再处理

⑻ 什么是API接口,PHP开发API接口的例子

就是php只处理数据,而不直接输出html


把视图层都交给js去完成。


比如:

//获取数据
$id=$_GET['id'];
if($id){
//支数据库取数据
$sql="select*fromtablewhereid='".$id."'";
$re=.....;
echojson_encode($re);//返回json格式数据给前端处理
}

//修改数据
if($id&&$_GET['edit']){
////数据库操作
echo"修改成功";
}

⑼ 求助大神,php api接口怎么写

可以写个interface 让别人来实现接口的方法就行了。
任何网页都可以是接口,为了方便数据解析一般都用json和xml响应

阅读全文

与phprestapi实例相关的资料

热点内容
银河麒麟下编译qt源码 浏览:162
读单片机的flash 浏览:838
安全不收费的看片网站 浏览:945
单片机显示屏加排阻 浏览:729
新京报pdf 浏览:403
日本韩国推理片电影免费 浏览:823
c语言求n的阶乘递归算法 浏览:203
服务器未回应是什么原因 浏览:816
缥缈白姬和轩之结局 浏览:593
全球票房在哪里查 浏览:781
宝书网小说 浏览:812
无水印高清电影 浏览:772
拼车夫妇韩国中文 浏览:783
怎么在设置开启app内购买 浏览:335
三个女人在监狱是什么电影曹查理演的 浏览:434
复爱旧仇电影日本 浏览:210
军用压缩饼干和军粮 浏览:596
韩国成人百合电影 浏览:271
戴拿奥特曼客串过的电影 浏览:403