REST API详解

一 REST的概念

REST(Representational State Transfer)含状态传输是一种软件架构风格。
要点

资源由URI(统一资源定位符)的来指定。
通过资源的表现形式来操作资源
对资源的操作包括获取、创建、修改和删除资源,对应HTTP协议提供的GET、POST、PUT 和DELETE方法
这里写图片描述
- 安全-指的是对原有资源没有任何影响
- 等幂-不管操作多少次对资源的影响都是一样的。

这里,再讲解下PUT和POST的区别

 

  1.  
  2. 最大的区别是PUT是等幂的,也就是同一个操作,不管PUT多少次,都是一样的。而POST则不一样,POST多次会导致多个资源被创建。
  3. PUT需要完整的URI,而POST不需要。如果,URL不完整,PUT不会被执行。
    这里写图片描述

 


简单来说,REST就是对资源的操作都可以通过URI来完成,REST是基于资源的。


二 REST的要求

<span style="color:#000000"><code>客户端和服务器的架构
链接协议的无状态(协议本身不记录链接的状态信息)
层次化的系统
可以利用<span style="color:#000088 !important">Cache</span>来提高性能
</code>
   </span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

三 基于HTTP的REST简介

REST API不依赖于协议,但是几乎全部的REST都是基于HTTP协议的。因此,举例也就只举HTTP的例子。基于HTTP的REST API包括三部分:

<span style="color:#000000"><code><span style="color:#006666 !important"><span style="color:#006666 !important">1</span></span> 资源的URI
<span style="color:#006666 !important"><span style="color:#006666 !important">2</span></span> 资源的传输格式
<span style="color:#006666 !important"><span style="color:#006666 !important">3</span></span> 对资源的操作(GET、POST、PUT,DELETE,<span style="color:#000088 !important"><span style="color:#000088 !important">Options</span></span>,<span style="color:#000088 !important"><span style="color:#000088 !important">Head</span></span>方法)</code>
   </span>
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

HTTP的交互的过程是客户端发出一个请求,然后服务器返回一个请求。交互的过程中,处理传递的数据之外,也需要一些meta Data用来传递额外的信息(例如接受的数据格式,授权,证书等信息)。一个REST的HTTP请求如图

其中

  • VERB是HTTP的方法,例如GET POST DELETE等
  • URI指定资源的位置
  • HTTP Version,HTTP的版本
  • Request Header。header包含了metaData,也就是上面说的额外信息。
  • Request Body,实际传递的消息。

例如,一个GET 方法,(默认在浏览器中输入URL然后回车,就是GET方法)

<span style="color:#000000"><code><span style="color:#009900 !important"><span style="color:#009900 !important">GET</span></span> www.baidu.com
<span style="color:#009900 !important"><span style="color:#009900 !important">Accept</span></span><span style="color:#009900 !important"><span style="color:#009900 !important">:*/*</span></span>
<span style="color:#009900 !important"><span style="color:#009900 !important">Accept</span></span>-<span style="color:#009900 !important"><span style="color:#009900 !important">Encoding</span></span><span style="color:#009900 !important"><span style="color:#009900 !important">:gzip</span></span>, deflate, sdch
<span style="color:#009900 !important"><span style="color:#009900 !important">Accept</span></span>-<span style="color:#009900 !important"><span style="color:#009900 !important">Language</span></span><span style="color:#009900 !important"><span style="color:#009900 !important">:zh-CN</span></span>,zh;q=<span style="color:#006666 !important"><span style="color:#006666 !important">0</span></span>.<span style="color:#006666 !important"><span style="color:#006666 !important">8</span></span>,en;q=<span style="color:#006666 !important"><span style="color:#006666 !important">0</span></span>.<span style="color:#006666 !important"><span style="color:#006666 !important">6</span></span>
<span style="color:#009900 !important"><span style="color:#009900 !important">Connection</span></span><span style="color:#009900 !important"><span style="color:#009900 !important">:keep-alive</span></span>
<span style="color:#009900 !important"><span style="color:#009900 !important">Content</span></span>-<span style="color:#009900 !important"><span style="color:#009900 !important">Type</span></span><span style="color:#009900 !important"><span style="color:#009900 !important">:text/plain</span></span>; charset=utf-<span style="color:#006666 !important"><span style="color:#006666 !important">8</span></span>
<span style="color:#009900 !important"><span style="color:#009900 !important">Cookie</span></span><span style="color:#009900 !important"><span style="color:#009900 !important">:BDUSS=</span></span><span style="color:#006666 !important"><span style="color:#006666 !important">1</span></span>hCVG9GN29OSkkwdld-<span style="color:#009900 !important"><span style="color:#009900 !important">MEh3enJBLUVnZGxKRTB5NTBCQW5BamRobTB4SGtzTWxVQVFBQUFBJCQAAAAAAAAAAAEAAADZ4YEvx6PE47XEX1pVT8rWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQjolTkI6JUT</span></span>; <span style="color:#009900 !important"><span style="color:#009900 !important">BAIDUID</span></span>=<span style="color:#006666 !important"><span style="color:#006666 !important">8</span></span><span style="color:#009900 !important"><span style="color:#009900 !important">BD0E853CDCBAD524D6691E5AE0C61BB:</span></span><span style="color:#009900 !important"><span style="color:#009900 !important">FG</span></span>=<span style="color:#006666 !important"><span style="color:#006666 !important">1</span></span>; <span style="color:#009900 !important"><span style="color:#009900 !important">BAIDUPSID</span></span>=<span style="color:#006666 !important"><span style="color:#006666 !important">8</span></span>BD0E853CDCBAD524D6691E5AE0C61BB; locale=zh; <span style="color:#009900 !important"><span style="color:#009900 !important">MCITY</span></span>=-<span style="color:#006666 !important"><span style="color:#006666 !important">289</span></span>%<span style="color:#006666 !important"><span style="color:#006666 !important">3</span></span>A; <span style="color:#009900 !important"><span style="color:#009900 !important">B64_BOT</span></span>=<span style="color:#006666 !important"><span style="color:#006666 !important">1</span></span>; <span style="color:#009900 !important"><span style="color:#009900 !important">BD_HOME</span></span>=<span style="color:#006666 !important"><span style="color:#006666 !important">1</span></span>; <span style="color:#009900 !important"><span style="color:#009900 !important">BD_UPN</span></span>=<span style="color:#006666 !important"><span style="color:#006666 !important">123253</span></span>; <span style="color:#009900 !important"><span style="color:#009900 !important">BDRCVFR</span></span>[feWj1Vr5u3D]=<span style="color:#009900 !important"><span style="color:#009900 !important">I67x6TjHwwYf0</span></span>; <span style="color:#009900 !important"><span style="color:#009900 !important">H_PS_645EC</span></span>=a1bfJPwk9lOpMwLUJPTu1EGEjyg7U%<span style="color:#006666 !important"><span style="color:#006666 !important">2</span></span>B0iMwXeWzgjyMiK62RLlrkuWmGwFvFTes98m0qN; <span style="color:#009900 !important"><span style="color:#009900 !important">BD_CK_SAM</span></span>=<span style="color:#006666 !important"><span style="color:#006666 !important">1</span></span>; <span style="color:#009900 !important"><span style="color:#009900 !important">BDSVRTM</span></span>=<span style="color:#006666 !important"><span style="color:#006666 !important">84</span></span>; <span style="color:#009900 !important"><span style="color:#009900 !important">H_PS_PSSID</span></span>=<span style="color:#006666 !important"><span style="color:#006666 !important">12760_12528_1443_12772_12691_12717_12721_12728_12735_12739_12743_12763_12781_8498_11422</span></span>
<span style="color:#009900 !important"><span style="color:#009900 !important">Host</span></span><span style="color:#009900 !important"><span style="color:#009900 !important">:www</span></span>.baidu.com
<span style="color:#009900 !important"><span style="color:#009900 !important">User</span></span>-<span style="color:#009900 !important"><span style="color:#009900 !important">Agent</span></span><span style="color:#009900 !important"><span style="color:#009900 !important">:Mozilla/</span></span><span style="color:#006666 !important"><span style="color:#006666 !important">5.0</span></span> (<span style="color:#009900 !important"><span style="color:#009900 !important">Macintosh</span></span>; <span style="color:#009900 !important"><span style="color:#009900 !important">Intel</span></span> <span style="color:#009900 !important"><span style="color:#009900 !important">Mac</span></span> <span style="color:#009900 !important"><span style="color:#009900 !important">OS</span></span> <span style="color:#009900 !important"><span style="color:#009900 !important">X</span></span> <span style="color:#006666 !important"><span style="color:#006666 !important">10_10_2</span></span>) <span style="color:#009900 !important"><span style="color:#009900 !important">AppleWebKit</span></span>/<span style="color:#006666 !important"><span style="color:#006666 !important">537.36</span></span> (<span style="color:#009900 !important"><span style="color:#009900 !important">KHTML</span></span>, like <span style="color:#009900 !important"><span style="color:#009900 !important">Gecko</span></span>) <span style="color:#009900 !important"><span style="color:#009900 !important">Chrome</span></span>/<span style="color:#006666 !important"><span style="color:#006666 !important">41.0</span></span>.<span style="color:#006666 !important"><span style="color:#006666 !important">2272.76</span></span> <span style="color:#009900 !important"><span style="color:#009900 !important">Safari</span></span>/<span style="color:#006666 !important"><span style="color:#006666 !important">537.36</span></span> </code>
   </span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

上述除了GET www.baidu.com之外都是headers。具体的header字段含义可以参考wiki
http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

发出请求后,服务器返回响应。响应的格式如下

  • HTTP Version HTTP的版本
  • Response Code 表示请求的状态。例如404Not found不少人遇到过吧
  • Response Header表示返回信息的头信息
  • Response Body 包含实际数据

例如,上述对www.baidu.com的GET方法
Response Code

Status Code:200 OK 表示请求成功

Response Header

BDPAGETYPE:2
BDQID:0xf0ed07ea0034f3f2
BDUSERID:797041113
Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Mon, 09 Mar 2015 01:53:10 GMT
Expires:Mon, 09 Mar 2015 01:53:10 GMT
Server:BWS/1.1
Set-Cookie:BDSVRTM=326; path=/
Set-Cookie:BD_HOME=1; path=/
Set-Cookie:H_PS_PSSID=12760_12528_1443_12772_12691_12717_12721_12728_12735_12739_12743_12763_12781_8498_11422; path=/; domain=.baidu.com
Transfer-Encoding:chunked
Via:1.1 hkidc-dmz-wsa-4-mgmt.cisco.com:80 (Cisco-WSA/8.5.0-497)

Response Body

是一个HTML网页,内容过多,这里不列出来了。


四 举例

首先介绍一个小工具,Chrome的扩展程序,用来测试REST API。
Advanced REST Client
这里写图片描述
然后,我们利用这个程序来测试一个免费的获取天气的网站REST API。
网站地址
http://openweathermap.org/current

然后,用这个工具来测试GET方法
GET http://api.openweathermap.org/data/2.5/weather?q=Shanghai,china

<span style="color:#000000"><code>Status
<span style="color:#006666 !important"><span style="color:#006666 !important">200</span></span> OK Show explanation Loading <span style="color:#4f4f4f !important"><span style="color:#4f4f4f !important">time</span></span>: <span style="color:#006666 !important"><span style="color:#006666 !important">388</span></span>


<span style="color:#4f4f4f !important"><span style="color:#4f4f4f !important">Request</span></span> headers 
User-Agent: Mozilla/<span style="color:#006666 !important"><span style="color:#006666 !important">5.0</span></span> (Macintosh; Intel Mac OS X <span style="color:#006666 !important"><span style="color:#006666 !important">10</span></span>_10_2) AppleWebKit/<span style="color:#006666 !important"><span style="color:#006666 !important">537.36</span></span> (KHTML, like Gecko) Chrome/<span style="color:#006666 !important"><span style="color:#006666 !important">41.0</span></span><span style="color:#006666 !important"><span style="color:#006666 !important">.2272</span></span><span style="color:#006666 !important"><span style="color:#006666 !important">.76</span></span> Safari/<span style="color:#006666 !important"><span style="color:#006666 !important">537.36</span></span>
Content-Type: text/plain; charset=utf-<span style="color:#006666 !important"><span style="color:#006666 !important">8</span></span> 
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=<span style="color:#006666 !important"><span style="color:#006666 !important">0.8</span></span>,en;q=<span style="color:#006666 !important"><span style="color:#006666 !important">0.6</span></span>
Cookie: __utmt=<span style="color:#006666 !important"><span style="color:#006666 !important">1</span></span>; __utma=<span style="color:#006666 !important"><span style="color:#006666 !important">124807636.1438772543</span></span><span style="color:#006666 !important"><span style="color:#006666 !important">.1425606715</span></span><span style="color:#006666 !important"><span style="color:#006666 !important">.1425869175</span></span><span style="color:#006666 !important"><span style="color:#006666 !important">.1425872408</span></span><span style="color:#006666 !important"><span style="color:#006666 !important">.7</span></span>; __utmb=<span style="color:#006666 !important"><span style="color:#006666 !important">124807636.1</span></span><span style="color:#006666 !important"><span style="color:#006666 !important">.10</span></span><span style="color:#006666 !important"><span style="color:#006666 !important">.1425872408</span></span>; __utmc=<span style="color:#006666 !important"><span style="color:#006666 !important">124807636</span></span>; __utmz=<span style="color:#006666 !important"><span style="color:#006666 !important">124807636.1425777557</span></span><span style="color:#006666 !important"><span style="color:#006666 !important">.4</span></span><span style="color:#006666 !important"><span style="color:#006666 !important">.2</span></span>.utmcsr=so.com|utmccn=(organic)|utmcmd=organic|utmctr=weather.com%<span style="color:#006666 !important"><span style="color:#006666 !important">20</span></span>REST%<span style="color:#006666 !important"><span style="color:#006666 !important">20</span></span>API


<span style="color:#4f4f4f !important"><span style="color:#4f4f4f !important">Response</span></span> headers 
<span style="color:#4f4f4f !important"><span style="color:#4f4f4f !important">Server</span></span>: nginx 
<span style="color:#4f4f4f !important"><span style="color:#4f4f4f !important">Date</span></span>: Mon, <span style="color:#006666 !important"><span style="color:#006666 !important">09</span></span> Mar <span style="color:#006666 !important"><span style="color:#006666 !important">2015</span></span> <span style="color:#006666 !important"><span style="color:#006666 !important">03</span></span>:<span style="color:#006666 !important"><span style="color:#006666 !important">46</span></span>:<span style="color:#006666 !important"><span style="color:#006666 !important">05</span></span> GMT 
Content-Type: application/json; charset=utf-<span style="color:#006666 !important"><span style="color:#006666 !important">8</span></span> 
Transfer-Encoding: chunked 
Connection: keep-alive
X-Source: redis
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: <span style="color:#006666 !important"><span style="color:#006666 !important">true</span></span>
Access-Control-Allow-Methods: <span style="color:#000088 !important"><span style="color:#000088 !important">GET</span></span>, POST</code>
   </span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

返回的message内容

{“coord”:{“lon”:121.47,”lat”:31.23},”sys”:{“type”:1,”id”:7452,”message”:0.1765,”country”:”China”,”sunrise”:1425852688,”sunset”:1425895071},”weather”:[{“id”:804,”main”:”Clouds”,”description”:”overcast clouds”,”icon”:”04d”}],”base”:”cmc stations”,”main”:{“temp”:283.62,”pressure”:1027,”humidity”:81,”temp_min”:282.15,”temp_max”:285.93},”wind”:{“speed”:6,”deg”:310},”clouds”:{“all”:90},”dt”:1425869026,”id”:1796231,”name”:”Shanghai”,”cod”:200}


五 REST的优点

通讯本身的无状态特性会提高服务器对请求的处理能力
浏览器的本身就是客户端
相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
可以利用缓存来提高性能

 

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ArcGIS REST API是Esri公司提供的一种基于HTTP/HTTPS协议的Web API,用于访问和管理ArcGIS Server和ArcGIS Online等GIS服务和资源。ArcGIS REST API支持多种编程语言和平台,例如Java、Python、JavaScript、.NET、iOS和Android等。以下是ArcGIS REST API的一些主要特点和功能: 1. 支持多种HTTP操作:ArcGIS REST API支持多种HTTP操作,例如GET、POST、PUT和DELETE等,可以用于从GIS服务中获取或修改数据。 2. 支持多种数据格式:ArcGIS REST API支持多种数据格式,包括JSON、XML、HTML和二进制等,可以根据需要选择合适的数据格式。 3. 支持多种GIS服务和资源:ArcGIS REST API支持多种GIS服务和资源,例如地图服务、要素服务、空间分析服务、地理编码服务、地理处理服务、Web地图和Web应用程序等。 4. 支持数据查询和过滤:ArcGIS REST API支持对GIS服务中的数据进行查询和过滤,可以根据要求返回符合条件的数据。 5. 支持安全认证和授权:ArcGIS REST API支持多种安全认证和授权方式,例如基本认证、令牌认证和OAuth2.0认证等,可以保证GIS服务和资源的安全性和可靠性。 6. 支持跨域访问:ArcGIS REST API支持跨域访问,可以在不同的域名和网站之间进行数据交互和共享。 7. 支持自定义扩展:ArcGIS REST API支持自定义扩展,可以根据需要扩展和定制GIS服务和资源的功能和特性。 总之,ArcGIS REST API是Esri公司提供的一种基于HTTP/HTTPS协议的Web API,用于访问和管理ArcGIS Server和ArcGIS Online等GIS服务和资源,具有多种特点和功能,可以满足不同用户的需求和要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值