新手咨询一下,我想在一个服务器端口上同时实现restful的API服务和socket服务,这个该如何实现?还请高手帮帮忙~谢谢
跟人意见:
基本上如果要完全统一,是很困难的,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处理掉不同的入口。
@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
@dayuoba 唯一的冲突纯ws里面,没有任何的所谓的uri,method,header之类的(除了在handshake),如果是http的restful的话,基本上在不使用框架的情况之下自己封装是很辛苦的。还有加上了ws跟http本身的authentication方面的区别。restful接口的security跟ws的也有差别。
如果真的要做的话,就要看看譬如说,用socket.io,然后写两个不同的delegators,几种我想到的方案是
- 直接写多个入口,用model写好你的logic后,分别调用(mvc的正确做法)
- 连入口都懒的写的话,可以用express/koa/connect这些加socket.io,然后定义出一些自己的协议来simulater header,methods之类的,然后自己调express/koa/connect的middleware
- meteor+http package去做一些封装(当然这只是一个example,还有很多框架可以实现)
那当然,到最后还要看场景,分析这值不值得,有如,如果不是一个single page application,或者不是一个非常多服务交互的页面,使用纯http还更好。或者,如果只有单向的,可以选择server-events之类的。socket是一个类似tcp的常链接东西,你想象一下,如果你的页面不停的会刷掉,每次都要建立一个新的链接的话,那不如就用正常http好的,没差。
@tulayang 这个东西上呢,我就不多说了,也没有这个需要争论,这的确不是一个协议标准,而是提倡大家尽量根据http协议标准设计的方案。URI只是一部分。 大家可以自己看看 http://en.wikipedia.org/wiki/Representational_state_transfer @dayuoba 楼主问了关于restful和socket,所以我就觉得说从restful和ws根本上去讨论这个问题,我估计也太罗嗦了,我是新手,不太懂规矩 :P @HaoLee 希望没有太罗嗦,我只是从rest和socket的根本上说,我理解上没理解到了你要的是框架使用的层面,但是希望这可以有帮助你在设计这个系统的时候衍生出更多的想法 :D