我有一个使用AJAX从服务器获取JSON数据的Web应用程序.它要求用户首先使用浏览器登录,以便设置cookie.仅使用GET
和POST
谓词,其中GET
用于检索数据,POST
用于修改数据的任何操作.
据我所知,REST与上述方法的不同之处在于,每次请求都会发送用户认证信息,PUT
并且DELETE
也会使用和动词.
我的问题是,如果终点只是用户的浏览器,那么REST Web服务对类似RPC的方法有什么好处?我可以理解当客户端未知时REST是如何有益的,但是当我只使用jQuery ajax调用时,与类似RPC的方法相比,它的好处还是值得吗?
我正在iOS和Android中构建本机移动应用程序.这些应用程序需要与服务器进行"实时"更新,与任何其他基于网络的应用程序相同(Facebook,Twitter,社交游戏,如Words with Friends等)
我认为使用HTTP长轮询是因为长轮询可能对电池寿命有害,尤其是在大量TCP设置/拆除时.让移动应用程序使用持久性TCP套接字建立与服务器的连接,并将RPC样式命令发送到服务器以进行所有Web服务通信可能是有意义的.当然,这需要服务器处理长期存在的TCP连接,并且一旦理解了传递到TCP管道的数据,就能够与Web服务通信.我正在考虑使用JSON或XML以纯文本格式传递数据.
也许基于Erlang的RPC服务器可以很好地用于这样的基于网络的应用程序.它允许移动应用程序通过一个连接从服务器发送和接收数据,而无需多个设置/拆卸,单个HTTP请求将使用类似iOS上的NSURLConnection.由于不涉及Web浏览器,我们不需要在移动客户端级别处理HTTP的细微差别.很多这些"COMET"和长轮询/流媒体服务器都是基于HTTP构建的.我认为只使用TCP上的纯文本协议就足够了,可以使客户端响应更快,允许从服务器接收更新,并通过传统的长轮询和流模型保持电池寿命.
目前是否有人使用其原生iOS或Android应用程序执行此操作?您是否编写了自己的服务器,或者是否有一些开源的东西,我今天可以开始使用而不是重新发明轮子?有没有理由为什么只使用基于TCP的RPC服务比使用HTTP更糟糕?
我还研究了HTTP流水线技术,但在客户端实现它时,它看起来并不值得.此外,我不确定它是否允许在客户端< - >服务器通信通道中进行双向通信.
任何见解将不胜感激.
我的.proto
文件中有以下架构:
service MyService {
rpc GetItem (ItemQuery) returns (Item) {
}
}
message ItemQuery {
int id = 1;
}
message Item {
int id = 1;
string name = 2;
}
Run Code Online (Sandbox Code Playgroud)
现在我想添加另一个rpc方法来返回多个Items.像这样的东西:
rpc GetItems (ItemsQuery) returns (repeated Item) {
}
Run Code Online (Sandbox Code Playgroud)
有没有比定义Items消息更好的方法呢?
安装iPhone SDK 3.1.2后,Interface Builder不再与Xcode同步.XIB窗口底部的指示灯为灰色.IB没有看到Xcode项目中的任何文件.当我开始IB时,Xcode总是打开的.
我试过重启.没运气.
我尝试删除Xcode/IB的首选项文件.没运气.
我尝试重新安装Xcode/IB.仍然没有运气.
本页介绍IB如何监控Xcode中的更改.虽然这是一个有趣的阅读,但它没有提供任何有关如何调查我的问题的帮助.
任何帮助,将不胜感激.
编辑
这里有更多信息.我为launchd启用了调试日志,我注意到每次启动Interface Builder时都会出现以下行:
[0x0-0x1b01b].com.apple.InterfaceBuilder3[315]: Couldn't open shared capabilities memory GSCapabilities (No such file or directory)
Run Code Online (Sandbox Code Playgroud)
这似乎与我的问题有关.
我收到以下异常:
com.google.gwt.user.client.rpc.SerializationException:类型'java.lang.Long'未包含在可由此SerializationPolicy序列化的类型集中,或者无法加载其Class对象.出于安全考虑,此类型不会被序列化
使用GWT 2.1和内置的Jetty服务器.根据文档,这种类型绝对是可序列化的...如何将它包含在SerializationPolicy中?
我正在创建一个Java应用程序,它需要JVM之间的主从通信,可能驻留在同一台物理机器上.将在Java EE应用程序服务器(即JBoss)内部运行一个"主"服务器,该服务器将"从"客户端连接到它并动态注册自己进行通信(即主服务器将不知道该服务器的IP地址/端口奴隶因此无法提前配置).主服务器充当控制器,它将向从站执行工作,并且从站将定期响应通知,因此将进行双向通信.
我最初想的是基于RPC的系统,其中每一方都是服务器,但它可能变得复杂,所以我更喜欢一种机制,其中有一个打开的套接字,它们来回交谈.
我正在寻找一种低延迟的通信机制,其中消息主要是原始类型,因此不需要严格的序列化.这是我看过的:
有没有我缺少的技术?
编辑:还看了看:
我本周开始使用ZeroMQ,当使用请求 - 响应模式时,我不确定如何让工作人员安全地"挂断"并关闭他的套接字而不可能丢弃消息并导致发送该消息的客户永远不会得到响应.想象一下用Python编写的工人看起来像这样:
import zmq
c = zmq.Context()
s = c.socket(zmq.REP)
s.connect('tcp://127.0.0.1:9999')
while i in range(8):
s.recv()
s.send('reply')
s.close()
Run Code Online (Sandbox Code Playgroud)
我一直在做实验,并且发现一个127.0.0.1:9999
套接字类型的客户zmq.REQ
做出一个公平排队的请求可能会让公司排队算法在工人完成最后一次工作之后send()
但在工作之前就选择上面的工作人员.以下close()
方法.在这种情况下,似乎请求由工作进程中的ØMQ堆栈接收和缓冲,并且当close()
抛出与套接字关联的所有内容时请求将丢失.
工人如何"安全"分离 - 有没有办法发出"我不再需要消息"的信号,然后(a)循环传输信号期间到达的任何最终消息,(b)生成他们的回复,然后(c)执行close()
保证不丢弃任何消息?
编辑:我想我想要输入的原始状态是"半封闭"状态,没有进一步的请求可以接收 - 并且发送者会知道 - 但返回路径仍然打开,以便我可以检查我的传入缓冲区是一个最后到达的消息,如果有一个坐在缓冲区中则响应它.
编辑:在回答一个好问题时,更正了描述以使等待消息的数量为多个,因为可能有许多连接在等待回复.
我正在尝试运行一个使用rpcgen创建的简单RPC程序.这是一个简单的因子计划.这是我的第一个RPC程序.make工作正常.还创建了可执行文件.但是在尝试运行可执行文件时,我收到此错误:
$sudo ./fact_server
Cannot register service: RPC: Unable to receive; errno = Connection refused
unable to register (FACTPROGRAM, FACTVERSION, udp).
Run Code Online (Sandbox Code Playgroud)
我尝试在具有相同操作系统(ubuntu)的另一台PC上运行相同的程序.它在那里运行完美.