如何使php调用restful apii万能的异构调用

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
基于RESTful Web的智能家居系统应用
下载积分:990
内容提示:基于RESTful Web的智能家居系统应用
文档格式:PDF|
浏览次数:1|
上传日期: 20:51:25|
文档星级:
该用户还上传了这些文档
基于RESTful Web的智能家居系统应用
官方公共微信您所在的位置: &
iPhone中调用WCF RESTful Service
iPhone中调用WCF RESTful Service
REST(Representational State Transfer)是一种轻量级的Web Service架构风格,本文介绍了如何使用WCF创建restful分格的服务。通过这篇文章,作者将会通过一个demo来展示如何在iPhone中调用WCF restful service。
在前面我们介绍过,讲述的如何在iPhone中调用WCF服务。我现在开发是调用webService的,方式和那篇文章一样。需要定义soap,然后异步去调用服务端的方法,等服务端执行完成,然后在iPhone客户端接受返回的XML,最后解析返回的XML。这种方式用起来非常的不方便,每一次调用即需要写自定义的soap,又要解析XML。这篇文章我将讲述一下如何调用RESTful方式的WCF服务。
REST(Representational State Transfer)是一种轻量级的Web Service架构风格,其实现和操作明显比SOAP和XML-RPC更为简洁,可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速度,性能、效率和易用性上都优于SOAP协议。使用WCF创建RESTful分格的服务是非常方便的。这篇文章,我通过一个demo来展示如何在iPhone中调用WCF RESTful Service。
创建一个WCF RESTful Service。
1、创建一个数据交换实体类
&&&[DataContract] &public&class&User &{ &&&&&&&&&&&&&&&&&&&&[DataMember(Order&=&0)] &&&&&public&string&Name&{&&&} &&&&&&&&&&&&&&&&&&&&[DataMember(Order&=&1)] &&&&&public&string&DayOfbirth&{&&&} &}&
2、服务契约:定义了三个方法,分别用来获取用户的XML格式、json格式以及创建用户。
[ServiceContract] &public&interface&IService1 &{ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[OperationContract] &&&&&[WebGet( &&&&&&&&&UriTemplate&=&&User/{name}&, &&&&&&&&&ResponseFormat&=&WebMessageFormat.Json)] &&&&&User&GetUser(string&name); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[OperationContract] &&&&&[WebGet( &&&&&&&&&UriTemplate&=&&UserXML/{name}&, &&&&&&&&&ResponseFormat&=&WebMessageFormat.Xml)] &&&&&User&GetUserXML(string&name); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[OperationContract] &&&&&[WebInvoke(UriTemplate&=&&User/{name}/{dayOfbirth}&, &&&&&&&&&Method&=&&POST&, &&&&&&&&&ResponseFormat&=&WebMessageFormat.Json)] &&&&&User&CreateUser(string&name,&string&dayOfbirth); &&&&}&
3、服务实现:这里简单处理。
public&class&Service1&:&IService1 &{ &&&&&public&User&GetUser(string&name) &&&&&{ &&&&&&&&&return&new&User&{&Name&=&name,&DayOfbirth&=&new&DateTime().ToString()&}; &&&&&} &&&&&public&User&GetUserXML(string&name) &&&&&{ &&&&&&&&&return&new&User&{&Name&=&name,&DayOfbirth&=&new&DateTime().ToString()&}; &&&&&} &&&&&public&User&CreateUser(string&name,&string&dayOfbirth) &&&&&{ &&&&&&&&&return&new&User&{&Name&=&name,&DayOfbirth&=&dayOfbirth&}; &&&&&} &}&
4、对于vs2008创建的wcf服务,需要在.svc文件中加入下面代码:
Factory=&System.ServiceModel.Activation.WebServiceHostFactory&&
5、在web.config中将绑定方式改成webHttpBinding
6、在iis发布服务。
iPhone客户端调用:
这里使用ASIHTTPRequest,它是一个直接在CFNetwork上做的开源项目,提供了一个比官方更方便更强大的HTTP网络传输的封装,非常的好用。
在xcode中拖一个简单的界面,如下图,分别调用服务端的三个方法:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" width="330" height="605" src="/files/uploadimg/0080.png" />
定义下面三个方法与三个button的点击事件对应:
-&(IBAction)fetchXML:(id) &-&(IBAction)fetchJson:(id) &-&(IBAction)createJson:(id)&
三个点击事件的具体实现:下面的代码为了简单起见,直接将xml和json输入。比较好的做法是:在iPhone也定义一个User类,将json或者XML转换为User实体对象。
-&(IBAction)fetchXML:(id)sender &{ &&&&&NSURL&*url&=&[NSURL&URLWithString:@&http://10.5.23.117:21924/Service1.svc/UserXML/zhuqilin&]; &&&&&ASIHTTPRequest&*request&=&[ASIHTTPRequest&requestWithURL:url]; &&&&&[request&startSynchronous]; &&&&&NSError&*error&=&[request&error]; &&&&&if&(!error)&{ &&&&&&&&&NSString&*response&=&[request&responseString]; &&&&&&&&&UIAlertView&*alertView&=&[[UIAlertView&alloc]&initWithTitle:@&xml格式&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&message:response &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&delegate:nil &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&cancelButtonTitle:@&OK&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&otherButtonTitles:nil]; &&&&&&&&&[alertView&show]; &&&&&&&&&[alertView&release]; &&&&&} &&&&&} &-&(IBAction)fetchJson:(id)sender &{ &&&&&NSURL&*url&=&[NSURL&URLWithString:@&http://10.5.23.117:21924/Service1.svc/User/zhuqilin&]; &&&&&ASIHTTPRequest&*request&=&[ASIHTTPRequest&requestWithURL:url]; &&&&&[request&startSynchronous]; &&&&&NSError&*error&=&[request&error]; &&&&&if&(!error)&{ &&&&&&&&&NSString&*response&=&[request&responseString]; &&&&&&&&&UIAlertView&*alertView&=&[[UIAlertView&alloc]&initWithTitle:@&JSON格式&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&message:response &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&delegate:nil &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&cancelButtonTitle:@&OK&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&otherButtonTitles:nil]; &&&&&&&&&[alertView&show]; &&&&&&&&&[alertView&release]; &&&&&} &} &-&(IBAction)createJson:(id)sender &{ &&&&&NSURL&*url&=&[NSURL&URLWithString:@&http://10.5.23.117:21924/Service1.svc/User/zhuqilin/&]; &&&&&ASIHTTPRequest&*request&=&[ASIHTTPRequest&requestWithURL:url]; &&&&&[request&setRequestMethod:@&POST&]; &&&&&[request&startSynchronous]; &&&&&NSError&*error&=&[request&error]; &&&&&if&(!error)&{ &&&&&&&&&NSString&*response&=&[request&responseString]; &&&&&&&&&UIAlertView&*alertView&=&[[UIAlertView&alloc]&initWithTitle:@&创建用户&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&message:response &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&delegate:nil &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&cancelButtonTitle:@&OK&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&otherButtonTitles:nil];& &&&&&&&&[alertView&show]; &&&&&&&&&[alertView&release]; &&&&&} &}&
输出结果:
1、获取json格式的数据
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" width="339" height="649" src="/files/uploadimg/0081.png" />
2、获取xml格式的数据
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" width="348" height="656" src="/files/uploadimg/0082.png" />
3、创建一个用户实体:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" width="353" height="665" src="/files/uploadimg/0083.png" />
总结:本文通过一个简单的例子说明了如何在iPhone中调用WCFRESTful服务。你会感觉到这个方式,比去定义soap去调用要好很多。
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&&&&&的更多文章
使用 iOS 6游戏开发入门经典(第2版) ,学习为iPhone 5和新iPad构
Android 4.4即将发布,这对大家来说都是很期待的,当
开发者在代码开发和维护中,往往会遇到很多代码优化和
现在的天气越来越冷了,感觉跟冬天似的,小编现在在发
本书是关于Spring 2.0的权威教程,是Java/Java EE开发者必备的参考书。本书详尽系统地介绍了Java EE的基础知识、Spring 2.0的各
Windows Phone专家
Android开发专家
51CTO旗下网站RESTful API版本控制策略 - 我期望的世界 - ITeye技术网站
博客分类:
做RESTful开放平台,一方面其API变动越少, 对API调用者越有利;另一方面,没有人可以预测未来,系统在发展的过程中,不可避免的需要添加新的资源,或者修改现有资源。因此,改动升级必不可少,但是,作为平台开发者,你必须有觉悟:一旦你的API开放出去,有人开始用了,你就不能只管自己Happy了,你对平台的任何改动都需要考虑对当前用户的影响。因此,做开放平台,你从第一个API的设计就需要开始API的版本控制策略问题,API的版本控制策略就像是开放平台和平台用户之间的长期协议,其设计的好坏将直接决定用户是否使用该平台,或者说用户在使用之后是否会因为某次版本升级直接弃用该平台。
版本控制策略模式
API的版本控制策略通常有3种模式:
第一种:The Knot:无版本,即平台的API永远只有一个版本,所有的用户都必须使用最新的API,任何API的修改都会影响到平台所有的用户。甚至平台的整个生态系统。
第二种:Point-to-Point:点对点,即平台的API版本自带版本号,用户根据自己的需求选择使用对应的API,需要使用新的API特性,用户必须自己升级。
第三种:Compatible Versioning:兼容性版本控制,和The Knot一样,平台只有一个版本,但是最新版本需要兼容以前版本的API行为。
三种策略对整个平台在升级API的开销对比如下:
以上信息来源于这篇文章:
作者以数学的方式详细的论述了这三种模式下,整个平台在升级API上的开销对比。
针对上面的论述,首先,API一定得有版本,否则升级对于用户来说将是噩梦。其次,要做到Compatible Versioning有现实的限制,毕竟API升级时,不可避免的会出现无法兼容老版本的状况,因此,版本控制需要结合第二种和第三种模式,即提供一个统一的兼容版本入口,同时对于不能兼容历史版本的API保留历史版本,支持用户能够调用到历史版本的API。另外,对历史版本的API支持一定要有时间和用户限制,即老版API支持到一定时间就删除,新用户必须使用新版API,否则一个API有10个版本会让平台的维护非常痛苦。
URI vs Request Parameter vs Media Type
在RESTful API领域,关于如何做版本控制,目前业界比较主流的有3种做法:
第一种:URI, 即在URI中直接标记使用的是哪个版本,无版本号URI默认使用最新版本。如下:
http://xianlinbox/api/customers/1234
http://xianlinbox/api/v3.0/customers/1234
好处:
直接可以在URI中直观的看到API版本,
可以直接在浏览器的查看各个版本API的结果
坏处:
版本号在URI中破坏了REST的HATEOAS(hypermedia as the engine of application state)规则。版本号和资源之间并无直接关系。
第二种:Request Parameter, 即在每个请求后添加一个version参数,表示请求的是哪个版本。如下:
http://server:port/api/customer/123?version=2
这种做法其实就是URI方式的变种,好坏处也都一样。
第三种: Mdedia Type, 即在HTTP请求的header中使用Media Type标记该请求想获取的资源, 同样的可以不设置或设置通用的Media Type表示最新版本的API。
===&
GET /customer/123 HTTP/1.1
Accept: application/vnd.xianlinbox.customer-v3+json
HTTP/1.1 200 OK
Content-Type: application/vnd.xianlinbox.customer-v3+json
{"customer":
{"name":"Xianlinbox"}
好处:
遵循了REST的设计风格,
坏处:
版本不直观,需要能设置header的client才能调用查看该API的效果。
浏览 15632
ningandjin
浏览: 644173 次
来自: 成都
这东东真的好用么/
http://git.oschina.net/zzq0324/ ...
gradle+maven+springboot实战课程观看地址 ...
你好,我在maven上面下载了swagger-springmv ...
博主写的不错,
思想和写的代码都挺好
我平时都是看老外的 ...何为Rest?Rest(Representational State Transfer)既表述性状态转移,REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式。获得这些表徵致使这些应用程序转变了其状态。随着不断获取资源的表示方式,客户端应用不断地在转变着其状态。REST为互联网应用量身定做的简洁模型、与HTTP协议的完美结合、构架的高扩展性,为互联网应用构架设计和异构系统集成设计带来便捷。Restful 服务应该遵循的原则?1、URL表示资源2、HTTP方法表示操作常用的HTTP动词有下面五个(括号里是对应的SQL命令)。
GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
DELETE(DELETE):从服务器删除资源。&
3、GET只是用来请求操作,GET操作永远都不应该修改服务器的状态。但是这个也要具体情况进行分析,例如一个页面中的计数器,每次访问的时候确实引起了服务器数据的改变,但是在商业上来说,这并不是一个很重要的改变,所以仍然可以接收使用GET的方式来修改数据。4、服务应该是无状态的 (也就是说服务器端不保存会话session)在有状态的会话中,服务器可以记录之前的信息。而RESTful风格中是不应该让服务器记录状态的,只有这样服务器才具备可扩展性。当然,我们可以在客户端使用cookie,而且只能用在客户端向服务器发送请求的时候。5、服务应当是&幂等&的&幂等&表示可以发送消息给服务,然后可以再次毫不费力的发送同样的消息给服务。例如,发送一个&删除第995场比赛&的消息,可以发送一次,也可以连续发送十次,最后的结果都会保持一致。当然,RESTful的GET请求通常是幂等的,因为基本上不会改变服务器的状态。注意:POST请求不能被定义为&幂等&,特别是在创建新资源的时候,一次请求创建一个资源,多次请求会创建多个资源。6、拥抱超链接7、服务应当自我说明例如 /match/995 请求了一个具体的比赛,但是 /match 并没有对任何实体进行请求,因此,应当返回一些介绍信息。8、服务约束数据格式。数据必须符合要求的格式
GET /zoos:列出所有动物园
POST /zoos:新建一个动物园
GET /zoos/ID:获取某个指定动物园的信息
PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
DELETE /zoos/ID:删除某个动物园
GET /zoos/ID/animals:列出某个指定动物园的所有动物
DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物
如果信息量过多,还可以带上参数:
?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件
建议:尽量带上版本号,如/v1/,大家可以。}

我要回帖

更多关于 如何调用restful api 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信