同时提供Restful和socket服务
发布于 3个月前 作者 HaoLee 503 次浏览 来自 问答

新手咨询一下,我想在一个服务器端口上同时实现restful的API服务和socket服务,这个该如何实现?还请高手帮帮忙~谢谢

13 回复

跟人意见:

基本上如果要完全统一,是很困难的,http的restful使用了很多的http里面的,譬如说,headers,而socket(我估计你是说websocket?)header是在连接的时候传输的。所以很多的东西不能共享,譬如说,method就不存在了在websocket,变成你要包装了,譬如说uri上面,restful里面的

PUT /users/:id
GET /users/:id
DELETE /users/:id

这些就没了header的话要自己封装了

再者,socket里面有很多的推送能力,很多时候,如果只会做一些简单的“restful”类的调用,websocket的性能相对更低。除非是single page application,或者服务器会推送,要不然,得不偿失。

但是如果要做的话,最好的方法把逻辑分开(那就是mvc的真正用途,model里面的逻辑跟入口的delegation逻辑分开)然后在controller处理掉不同的入口。

sails貌似就同时提供2种,你可以看看 自豪地采用 CNodeJS ionic

使用sails框架,很容易架设,sails已经整合socket, 我去年已经运用在实例当中 => 网址 , 实现用户登陆即时提醒,以及通知即时提醒。你是不想要这种效果?

restful只是通信URI的设计风格。 socket则是实际通信的底层。

@tulayang 这个其实不太对,restful其实不是uri设计风格,反而是说你用什么协议就要遵守协议里面的东西,譬如说,http的restful里面,提倡的是,正确使用method和header。 譬如,根据w3c的http规范,GET 和 HEAD 方法一定要是imdempotent,尽可能不该有副作用,有副作用也要确保这些副作用是不会影响这个“资源”的状态,在其他的方法没有被使用的情况之下,返回的资源资料要是一样的,其他方法,譬如说(put,post,delete…)是允许有副作用的,也代表会改变一个“资源/服务器”的状态。 URI,uniform resource identifier,顾名思义,是一个资源的名称,也因此,应该是一个名词,这个在restful里面没有规范你要如何定义。method,方法,是一个动词。其实,比http还要highlevel很多。 uri,我大可以 http://foo.com/thisisthenameofmyuser 或者 http://foo.com/1239239293293,都可以是同一个资源的uri,restful没有规范说一定要怎样设计一个uri,只有说应该使用你使用的协议里面定义的东西。 如果要说白了,就是,restful要求的是,任何遵守这个协议的软件可以在安全和可预知的情况之下运作,而不会譬如,crawler到了你的网站,找到了一个uri叫做"/removeUsers"然后用GET(在协议里这是安全的)到了这个uri之后,你的服务器竟然状态改了!还可能全部用户都删了!:P

@shekhei 与ws有什么冲突吗?

@dayuoba 唯一的冲突纯ws里面,没有任何的所谓的uri,method,header之类的(除了在handshake),如果是http的restful的话,基本上在不使用框架的情况之下自己封装是很辛苦的。还有加上了ws跟http本身的authentication方面的区别。restful接口的security跟ws的也有差别。

如果真的要做的话,就要看看譬如说,用socket.io,然后写两个不同的delegators,几种我想到的方案是

  1. 直接写多个入口,用model写好你的logic后,分别调用(mvc的正确做法)
  2. 连入口都懒的写的话,可以用express/koa/connect这些加socket.io,然后定义出一些自己的协议来simulater header,methods之类的,然后自己调express/koa/connect的middleware
  3. meteor+http package去做一些封装(当然这只是一个example,还有很多框架可以实现)

那当然,到最后还要看场景,分析这值不值得,有如,如果不是一个single page application,或者不是一个非常多服务交互的页面,使用纯http还更好。或者,如果只有单向的,可以选择server-events之类的。socket是一个类似tcp的常链接东西,你想象一下,如果你的页面不停的会刷掉,每次都要建立一个新的链接的话,那不如就用正常http好的,没差。

@shekhei

<<RESTful Web Services>> 第一章就讲:RESTfule是一种URI设计风格,并不是协议标准,你并不一定要遵守。

@shekhei 我猜楼主只是想实现httprestful+socket.io实时通信。 完全不清楚你这一大堆在讲什么

@dayuoba 还是你懂我,哈哈,不过楼上的回复也可以延伸学不少东西了……

@tulayang 这个东西上呢,我就不多说了,也没有这个需要争论,这的确不是一个协议标准,而是提倡大家尽量根据http协议标准设计的方案。URI只是一部分。 大家可以自己看看 http://en.wikipedia.org/wiki/Representational_state_transfer @dayuoba 楼主问了关于restful和socket,所以我就觉得说从restful和ws根本上去讨论这个问题,我估计也太罗嗦了,我是新手,不太懂规矩 :P @HaoLee 希望没有太罗嗦,我只是从rest和socket的根本上说,我理解上没理解到了你要的是框架使用的层面,但是希望这可以有帮助你在设计这个系统的时候衍生出更多的想法 :D

回到顶部