検索

REST介绍与REST在PHP中的应用

转自:http://www.nowamagic.net/librarys/veda/detail/1247

当HTTP被发明出来的时候,其实REST就已经存在了。可惜这么多年来,WEB开发模式却越来越背离HTTP的本质,舍本逐末的追求起RPC之类的东西。此时REST重新回到人们的视线里,无疑让大家开始反思过去走过的弯路。

本文并不想从头介绍REST,只是想举例说明一下需要注意的问题:

先来看看人们对REST的困惑:

REST什么样子?

最一般的REST例子,类似下面的样子:

1 POST?? /articles???? 创建
2 DELETE?/articles/123 删除
3 PUT??? /articles/123 更新或创建
4 GET??? /articles/123 查看

顺便说说几个知识点:

GET操作是安全的。所谓安全是指不管进行多少次操作,资源的状态都不会改变。比如我用GET浏览文章,不管浏览多少次,那篇文章还在那,没有变化。当然,你可能说每浏览一次文章,文章的浏览数就加一,这不也改变了资源的状态么?这并不矛盾,因为这个改变不是GET操作引起的,而是用户自己设定的服务端逻辑造成的。

PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同,DELETE也是一样。顺便说一句,因为GET操作是安全的,所以它自然也是幂等的。

POST操作既不是安全的,也不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建出了若干的资源。

安全和幂等的意义在于:当操作没有达到预期的目标时,我们可以不停的重试,而不会对资源产生副作用。从这个意义上说,POST操作往往是有害的,但很多时候我们还是不得不使用它。

还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST是作用在一个集合资源之上的(/articles),而PUT操作是作用在一个具体资源之上的(/articles/123),再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。

浏览器不支持PUT/DELETE方法怎么办?

大部分浏览器只支持GET/POST方法,这使得我们无法完美的实现REST。对于这样的情况,大致有几种解决方法,一种是在表单里加入一个_method之类名字的隐藏字段,用于表示真正的方法,另一种是使用X-HTTP-METHOD-OVERRIDE头信息来重载POST。

HTTP方法够用么?

从上面的例子,我们可以看到,通过使用已有的HTTP方法:POST,DELETE,PUT,GET就可以完成资源的增删改查,但在实际情况中,我们需要做的操作往往并不仅仅局限在简单的增删改查操作中,比如说我们要把一篇文章“置顶”,但是HTTP方法里没有一个和“置顶”操作相对应的方法,这时候该怎么办呢?REST对类似问题的解决方案是:创建一个新的资源!在上面的例子里,我们可以这样:

1 PUT /toparticles/123

通过创建出一个新的资源(toparticles),我们就可以使用简单的HTTP方法通吃一切操作了。

REST反对使用Session么?

牢记一点,REST拒绝Session!这是因为REST强调无状态性。这里的状态指的的应用状态,也可以称之为会话状态。一旦在服务端保持了这样的状态,那么架构的可扩展性将大打折扣。在REST看来,任何类似的状态本身都应该是一个独立的资源。

Cookie对REST有害么?

一分为二的看,如果Cookie里保存的是应用状态的话,就没有问题。因为应用状态本来就属于客户端。但如果使用Cookie保存类似PHPSESSIONID之类的东西就不对了,因为这样的数据并不属于客户端状态,它只不过是使用Session的借口而已。

再来看看REST在PHP中的现状:

PHP里的REST实现案例不多,有点影响都就是CakePHP和Zend,下面分别看看他们的实现:

CakePHP:

设定路由:

1 Router::parseExtensions('xml');
2 Router::mapResources('articles');

编写控制器:

1 class?ArticlesController?extends?AppController {
2 ????var?$components?=?array('RequestHandler');
3 ????function?view($id?= null) {
4 ????????$article?=?$this->Article->findById($id);
5 ????????$this->set(compact('article'));
6 ????}
7 ????// ...
8 }

视图:

1 <articles></articles>
2 <?php ?echo?$xml
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
浅析php中POST方法带参数跳转页面浅析php中POST方法带参数跳转页面Mar 23, 2023 am 09:15 AM

对于PHP开发者来说,使用POST带参数跳转页面是一项基本技能。POST是HTTP中一种发送数据的方法,它可以通过HTTP请求向服务器提交数据,跳转页面则是在服务器端进行页面的处理和跳转。在实际开发中,我们经常需要使用POST带参数来跳转页面,以达到一定的功能目的。

php怎么判断post有没有提交php怎么判断post有没有提交Mar 21, 2023 pm 07:12 PM

PHP是一种广泛使用的服务器端脚本语言,它可以用于创建交互式和动态的Web应用程序。在开发PHP应用时,我们通常需要通过表单将用户输入数据提交给服务器端处理。然而,有时候我们需要在PHP中判断是否有表单数据被提交,这篇文章将介绍如何进行这样的判断。

Flask-RESTPlus: 解决RESTful API中文乱码问题Flask-RESTPlus: 解决RESTful API中文乱码问题Jun 17, 2023 pm 10:26 PM

随着互联网的快速发展,越来越多的Web应用程序开始利用RESTfulAPI来提供数据服务。在使用RESTfulAPI时,中文乱码问题成为了开发者们头痛的问题。Flask-RESTPlus正是为解决这一问题而生。Flask-RESTPlus是Flask框架的一个扩展,它提供了一套基于Swagger标准的RESTfulAPI快速构建工具。与Flask-RE

python requests post如何使用python requests post如何使用Apr 29, 2023 pm 04:52 PM

python模拟浏览器发送post请求importrequests格式request.postrequest.post(url,data,json,kwargs)#post请求格式request.get(url,params,kwargs)#对比get请求发送post请求传参分为表单(x-www-form-urlencoded)json(application/json)data参数支持字典格式和字符串格式,字典格式用json.dumps()方法把data转换为合法的json格式字符串次方法需要

java如何发起http请求调用post与get接口java如何发起http请求调用post与get接口May 16, 2023 pm 07:53 PM

一、java调用post接口1、使用URLConnection或者HttpURLConnectionjava自带的,无需下载其他jar包URLConnection方式调用,如果接口响应码被服务端修改则无法接收到返回报文,只能当响应码正确时才能接收到返回publicstaticStringsendPost(Stringurl,Stringparam){OutputStreamWriterout=null;BufferedReaderin=null;StringBuilderresult=newSt

NGINX反向代理对HTML页面的POST请求返回405怎么解决NGINX反向代理对HTML页面的POST请求返回405怎么解决May 22, 2023 pm 07:49 PM

实现如下:server{listen80;listen443ssl;server_namenirvana.test-a.gogen;ssl_certificate/etc/nginx/ssl/nirvana.test-a.gogen.crt;ssl_certificate_key/etc/nginx/ssl/nirvana.test-a.gogen.key;proxy_connect_timeout600;proxy_read_timeout600;proxy_send_timeout600;c

PHP代码示例:如何用POST方式传参并实现页面跳转PHP代码示例:如何用POST方式传参并实现页面跳转Mar 07, 2024 pm 01:45 PM

标题:PHP代码示例:使用POST方式传参并实现页面跳转的方法在Web开发中,经常会涉及到如何通过POST方式传递参数,并在服务器端进行处理后实现页面跳转的需求。PHP作为一种流行的服务器端脚本语言,提供了丰富的函数和语法来实现这一目的。下面将通过一个实际的示例来介绍如何使用PHP来实现这一功能。首先,我们需要准备两个页面,一个用来接收POST请求并处理参数

PHP跳转页面并携带POST数据的实现方法PHP跳转页面并携带POST数据的实现方法Mar 22, 2024 am 10:42 AM

PHP是一种广泛应用于网站开发的编程语言,而页面跳转并携带POST数据是在网站开发中常见的需求。本文将介绍如何实现PHP页面跳转并携带POST数据,包括具体的代码示例。在PHP中,页面跳转一般通过header函数实现。如果需要在跳转过程中携带POST数据,可以通过以下步骤完成:首先,创建一个包含表单的页面,用户在该页面填写信息并点击提交按钮。在表单的acti

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。