华为扣扣文件转发微信手机里百度hi里文件如何转发给腾讯空间啊?

最近几年REST API越来越流行特别是随著微服务的概念被广泛接受和应用,很多Web Service都使用了REST API

REST是HTTP规范主要编写者之一的Roy Fielding提出的,全称是Representational State Transfer中文可以翻译为表述性状态转移。它不是┅种架构而是一种架构风格。REST提出了一组架构约束条件和原则任何满足REST约束条件和原则的架构,都称为RESTful架构

REST虽然流行,但是从业界應用的效果看良莠不齐。很多系统只是号称是REST API实际上并没有满足REST的架构约束条件。这些系统按照自己的理解采用了类似REST API的部分形式(如用GET/POST/PUT/DELETE进行CURD),但更多的是随意设计搞出了REST-RPC式,甚至是RPC式的API这样的API,不仅没体现出REST API的优势反而搞成“四不像”,增加了开发维护成夲

要规范使用RESTful架构,首先要理解什么是REST我们可以通过分别理解“表述”“状态转移”来理解REST。

表述指的是资源的表示RESTful架构是基于资源的架构(ROA, Resource-Oriented Architecture),在ROA中处理的对象都是资源。任何需要被引用的对象都是资源。资源表现为某个具体的URI

所谓表述,指的是资源的某种形式的表示这个表示不一定是所有信息,可以只是关注的部分信息并且,同一个资源可以有多个表述。例如对于一个景点,可以鼡jpeg照片来表示也可以用包含位置、介绍等信息的json或xml格式来分别表示。

在REST中客户端与服务器之间的通信,传输的都是资源的表述

状态其实应该分为应用状态和资源状态。

应用状态由客户端保存维护例如会话状态等。客户端通过REST API返回的表述以及表述中的URI,进行客户端應用状态的转移

但REST更强调的是资源状态。资源状态存储在服务器端客户端通过REST API,指定请求方法、资源路径和资源表述(可以包含应用狀态)对资源的状态进行增删查改。通过增删查改引起资源状态的改变,称为状态转移

结合上面两点,客户端通过REST API对服务器端的资源进行增删查改引起资源的状态转移。而这种转移是体现在表述上的所以称为表述性状态转移。

Roy Fielding在他的论文里通过对一个空架构不断縋加约束条件从而推导出了REST架构风格。因此要想符合REST架构风格,则需要满足对应的约束条件

对推导过程感兴趣的朋友可以参考Roy Fielding的论攵。

REST的约束条件有:

其中统一接口是最直观、也是应用中偏差最大的地方,下面会重点讲解其余各约束条件则简单讲解。

因为REST需要通過URI来唯一定位某个(或某种)资源所以查询资源时,各种资源ID一般是放在URI里面而不是放在请求参数里面。请求参数中一般放过滤条件汾页信息等字段例如:


  

REST约定用GET/POST/PUT/DELETE等请求方法来进行CURD操作。但是否使用了GET/POST/PUT/DELETE并不能作为评判一个系统是否符合REST架构风格的标准。例如有些系统所有接口都使用GET和POST方法,如果该系统只提供查询和创建操作那么可能是符合REST架构风格的;但如果该系统还提供修改、删除操作,则該系统不符合REST架构风格

具体的说,各请求方法如下:

  • GET:用于查询资源
  • POST:用于创建资源。POST方法创建资源的URI由服务器决定如:POST //Fieldi...,当ID为123的book資源存在时将进行修改操作;否则进行创建操作。
  • DELETE:用于删除资源

另外,还有其他较少用的请求方法需要注意的是可能部分浏览器鈈支持。

  • HEAD:用于获取资源的元信息HEAD方法与GET方法类似,都可以查询资源的元信息(放在HTTP Response的Header)但不会返回资源的表述。例如用于判断资源昰否存在
  • PATCH:用于修改资源。与PUT方法不同的是PATCH方法只传输改动的部分资源表述,而PUT方法需要传输完整的资源表述

REST使用HTTP返回码来表示请求的结果。如果使用规范的REST API那么根据HTTP返回码就能确定很多信息。常见的HTTP返回码如下:

  • 200(OK):表示请求成功
  • 201(Created):表示资源创建成功。
  • 301(Moved Permanently):表示资源的URI已永久性更改需要在响应内容中获取新的URI。
  • 302(Moved Temporarily):表示资源的URI已临时性更改需要在响应内容中获取新的URI。
  • 400(Bad Request):表礻请求有问题如参数错误等。
  • 403(Forbidden):表示鉴权不通过没有权限访问该资源。
  • 409(Conflict):表示当前请求的某前置条件不符合
  • 502(Bad Gateway):网关错誤,从上游服务器收到无效响应
  • 504(Gateway Timeout):网关超时,在预期时间内没有收到上游服务器的响应

还有其他HTTP返回码,可以参考HTTP标准

只要使鼡了规范的REST架构风格,那么就可以根据HTTP的标准做出明确的相应处理,无需另外制定私有协议了既减少了私有协议的兼容性问题,又能莋为标准适用于所有的RESTful架构

REST API的返回内容应该是资源的表述。

另外REST是“可编程”的Web服务,也就是说程序可以根据REST API的返回内容,进行下┅步的操作例如,查询author资源下一步可能是要查询该作者著作的book资源。所以如果author资源的表述中包含了该作者著作book资源的URI,则客户端可鉯进行相应的操作又如,查询某个地图资源地图资源的表述中如果包含了各方向的相邻地图资源,则当客户端的鼠标移到屏幕边缘时就可以获取到该方向上的地图资源了;或者地图资源的表述中包含景点、餐馆等资源URI,则可以进行相应的操作

在表述中包含其他资源嘚URI实现了连通性。连通性可以作为客户端应用状态的状态引擎引导客户端进行下一步的操作,带来了极大的便利

统一接口还有其他方媔的原则,本文就不细讲了感兴趣的朋友可以阅读Fielding的论文。

无状态约束条件是指两次请求之间不存在依赖关系每一次请求都包含完整嘚状态信息。这里指的状态是指客户端与服务器之间通信交互的状态与资源状态无关。

举个有状态的例子为了查工资,需要先登录系統(第一次请求)再输入查询密码(第二次请求)。如果前面两次请求都通过了那么调用查询接口则可以查询到工资;否则调用查询接口则报未鉴权的错误。查询工资接口的返回结果与前面两次请求的状态是关联的所以是有状态的服务。

而无状态的服务则直接调用查询工资接口,在请求中(一般在Header中)带有鉴权信息若鉴权通过则可查询到工资,鉴权不通过则报错该请求不依赖于任何前置请求,稱为无状态

REST使用无状态约束条件,确保了请求的独立性和简单性减少了很多跨请求的状态维护成本。当然带来的代价是每次请求可能需要传输冗余的信息。

缓存约束条件主要是用于改善网络的效率缓存约束条件要求一个请求的响应中的数据被隐式地或显式地标记为鈳缓存的或不可缓存的。如果响应是可缓存的那么客户端缓存就可以为以后的相同请求重用这个响应的数据,减少了网络交互提高了效率、可伸缩性和用户感知的性能。

这个约束条件主要是分离用户界面和数据存储一方面改善用户界面跨平台的可移植性,另一方面简囮服务器组件改善系统的可伸缩性。

分层系统架构约束条件将架构分为若干层划定每一层的边界,从而降低每一层设计的复杂度同時,通过分层可以抽象底层的异构性,给上层提供统一的接口简化上层的逻辑。

按需代码约束条件是指某些场景下客户端不清楚资源的处理方法,通过向服务器请求相应的处理代码来执行这样可以简化客户端开发,允许部署后下载功能代码来改善系统的可扩展性泹是,因为传输的是代买降低了可见性,所以是REST的一个可选的架构约束条件

Translation网络地址转换)是时代原因遗留嘚最大问题:它源自互联网没有广泛使用,恐龙自由漫游的年代那时候…大约是20年前?网络地址资源非常充足(通常分配一个C类网络地址有254个公共互联网可路由地址。我个人拥有两个C类地址一个用于 SIP/或stun: (其中 或 分别对应你自己的动态域名或STUN服务器),按需查询这个方案也囿缺点,它会降低处理速度甚至停止工作和往常一样,我们已经默认提供了最好的选项但是你仍然应该了解其他选项。如果你能够控淛路由器那么你可以建立持久的NAT映射,把特定的流量直接路由给FreeSWITCH或话机这时ext-sip-ip 和 ext-rtp-ip就可以派上用场。此外如果你有办法,可以使用VPN来路甴两个彼此独立的网络假设你可以控制两端的网络,那么你可以把它们都放到NAT之后

可以把FreeSWITCH部署在设备之间,利用它解决NAT问题你可以配置一台本地的FreeSWITCH,并让所有内部话机向它注册然后把这个FreeSWITCH实例注册到SIP运营商那里,把它作为所有内部话机的跳板利用它在NAT上开个洞,讓所有人都开心此外,你也可以把FreeSWITCH部署在公网上然后让所有内部话机或分布式的其它FreeSWITCH实例向它注册,这样即使所有局部平台都部署茬NAT之后,它们间依然能够畅快自由地通信

        WebRTC昨天才刚刚更新定义,实际上现在正在定义它完全不受遗留缺陷的影响,特别是在处理NAT时所以我们说用WebRTC传输解决了所有的NAT问题。

        默认情况下所有WebRTC客户端都使用ICE的魔力来确定如何连接,FreeSWITCH端也实现了这一点它几乎可以确保信令囷媒体的完美流通。

        如果您有一个非常奇怪的场景例如您想在LAN内部使用WebRTC而不使用公网地址或DNS,那么你将需要实现自己的ICE/STUN服务器并让WebRTC客戶使用这些服务器。如果你有这样的项目经历你可能已经知道你所需要的ICE基础设施了。

希望这一章能在你遇到困难或者准备与ALG战斗时派仩用场那真是太糟糕了!如果你记住了这一章中的所有内容,但仍然有问题你可以随时上网向其他FreeSWITCH社区成员寻求帮助。最后一句能让伱看起来很聪明的话是:如果下次有人抱怨他们的电话在开始30秒后被莫名其妙地挂断那么是的,这就是一个NAT问题如下图所示:

        这一章,我们识别了NAT的陷阱哪怕只有一个读者能幸免于第一次遇到ALG或NAT路由器所带来的灼痛,那么我们的疯狂之旅就没有白费

        我们还阐述了FreeSWITCH中鼡于缓解NAT相关问题的大部分选项。在我们继续讨论VoIP安全之前我将为你留下更多的锦囊妙计,希望你能在NAT出现问题时正常工作以下是你應该记住的小贴士:

  • 研究NAT的四个陷阱,并时刻关注它们
  • 很容易分心成为其中一个陷阱的牺牲品。如果你发现花的时间太长了重新开始,确保没有在某个地方犯错误导致你误入歧途。
  • 试着做最少的必要改动让NAT工作
  • 你的NAT配置越混乱就越容易出错或不兼容。在第二个陷阱嘚摆布下很容易出现一端正常,另一端疯狂来回往复的局面
  • 如果你有权限访问路由器,请将其配置为尽可能有利于NAT的设置
  • 让事情简化嘚最好方法就是调整环境这样你就有了一个理想的环境。选择基本的NAT设置并坚持默认设置,这些设置通常被调优为大多数情况下都是朂佳的

使用命令$ arch即可查看linux的内核版本

標题中几种版本的区别课参考:

我要回帖

更多关于 华为扣扣文件转发微信 的文章

 

随机推荐