通过http寻找api /协议

时间:2012-04-08 19:45:24

标签: java http frameworks jaxb protocols

我想在我拥有的几个组件之间设计一个协议。每个都可以在不同主机上的单独进程中运行。总有一个发起者(客户端)和响应者(服务器)。客户端可能使用多种语言java / c#/ c ++ / cli。我的服务器总是在java中 所以我考虑了以下属性:

  • 它应该是纯文本,因此很容易调试。
  • 它应该允许单方面升级(这意味着没有类序列化,也没有严格的方法签名)。
  • 如果它是一个框架,那么in应该很薄(WSDL看起来太多了我的需要)。

我以为在tcp上使用http 我主要对语法感兴趣,如果java中有框架已经提供了这样的功能。我隐约记得在Spring中有类似的东西。

编辑:我更喜欢瘦框架,而且我担心在RPC中更改方法签名会导致竞争问题。
我找到了this example,因为我已经在使用jaxb,所以可能会满足我的需求。

4 个答案:

答案 0 :(得分:3)

您可以查看REST / ful服务:

链接文章还讨论了一些指导原则,当SOAP和REST更适用时。

答案 1 :(得分:1)

我会选择WSDL。它实际上意味着在用各种语言编写的组件之间建立远程通信。我已经在C#,PHP,C ++,Python和Java的大量负载下长时间使用它,它非常棒。 基本上,您需要做的就是实际设计一个真正的协议,WSDL本身并不是 - 在这种情况下协议将是WSDL顶部的命令集,例如, Hello Command(某种ping),Login和Logout命令(用于会话),然后是你需要的各种东西。

答案 2 :(得分:1)

我会选择SOAP。虽然不是最简单的,但几乎所有语言/平台组合都有各种各样的库,并且它是相当可扩展的。 也可能会建议使用XML-RPC,但SOAP是其继承者,所以我建议不要使用XML-RPC。

答案 3 :(得分:0)

您可以保持TCP级别并使用zeromq之类的智能库来处理所有连接。然后,协议本身就是一组正确的消息,可以根据您的要求进行调整(并且与传输基础架构未预先确定的WSDL一样)。

示例(我挑战WebService支持者在他们的答案中填写示例;)

服务器(简称为python):

import zmq
ctx = zmq.Context()
socket = ctx.socket(zmq.REP)
socket.bind('tcp://0.0.0.0:12345')
while True:
    message = socket.recv()
    # 'status' and 'shutdown server' would be part of your protocol
    if message == "status":
        socket.send("I'm ok")
    elif message == "shutdown server":
        socket.send("Ok, bye bye")
        break
    # implement your other commands here ...
socket.close()

客户:

import zmq
ctx = zmq.Context()
socket = ctx.socket(zmq.REQ)
socket.connect('tcp://localhost:12345')
socket.send('shutdown server')
reply = socket.recv()
print(reply)

就是这样。是的,zeromq带有30多种语言绑定。