我们可以对REST服务进行UDP调用

时间:2018-02-10 10:30:01

标签: java rest web-services tcp udp

我有一个REST端点,我想使用UDP访问它,例如Java数据报。我知道这不是最好的做法,但我最近的项目有一些硬件限制。硬件只能进行UDP呼叫而我现有的服务都是通过REST进行的,即HTTP / HTTPS 我正在寻找可以重用现有服务的任何方式。我尝试过以下代码但收到了UnknownHostException

public class UDPClinet {
    public static void main(String[] args) {
        String hostname = "https://jsonplaceholder.typicode.com/posts/1";
        int port = 80;
        try {
            InetAddress address = InetAddress.getByName(hostname);
            DatagramSocket socket = new DatagramSocket();
            while (true) {
                DatagramPacket request = new DatagramPacket(new byte[1], 1, address, port);
                socket.send(request);
                byte[] buffer = new byte[512];
                DatagramPacket response = new DatagramPacket(buffer, buffer.length);
                socket.receive(response);
                String quote = new String(buffer, 0, response.getLength());
                System.out.println(quote);
                System.out.println();
                Thread.sleep(10000);
            }
        } catch (SocketTimeoutException ex) {
            System.out.println("Timeout error: " + ex.getMessage());
            ex.printStackTrace();
        } catch (IOException ex) {
            System.out.println("Client error: " + ex.getMessage());
            ex.printStackTrace();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}

3 个答案:

答案 0 :(得分:3)

是否可以实现可以通过UDP调用的RESTful服务。

是。 (见下文)

您可以通过UDP调用现有的RESTful服务吗?

几乎肯定没有。

典型的RESTful服务实际上是通过TCP / IP连接使用HTTP或HTTPS实现的。使用UDP直接与基于TCP的服务对话并非不可能。 IP级别的数据包将具有错误的协议族,服务的操作系统不会将它们路由到服务。

事实上,从技术上讲,可以通过任何能够发送消息的传输来实现RESTful服务。 REST原则与传输协议无关。

问题是找到一个支持它的服务框架,以及传统的RESTful HTTP。

还有其他一些实际问题:

  • UDP不可靠,如果您发送的数据报不适合使用默认MTU(1500字节)的数据包,则会加剧这种情况。

  • HTTPS使用TLS,以便客户端验证服务器的真实性,然后发送加密数据。可以使用TLS over UDP(称为DTLS)并由JCSE支持,但在典型的RESTful / HTTP框架中使用它可能具有挑战性。

如果您想要实现这一目标,请寻找实现CoAP(约束应用程序协议 - RFC 7252)和DTLS的RESTful框架。

答案 1 :(得分:1)

是的,现在有了REST over UDP的互联网标准,其名称为Constrained Application Protocoal - CoAP。 CoApp是从RFC 7252开始的一系列互联网标准中定义的。

CoAP解决了早先对此问题提出的关注,包括使用UDP上的重传使其可靠,以及使用DTLS提供安全性。

CoAP被设计为可在低至10 KiB的RAM和100 KiB的代码空间(RFC 7228)的微控制器上运行。此外,它使用4个字节的二进制固定标头和可变长度选项(例如可选的HTTP标头),为UDP数据包增加了很少的开销

答案 2 :(得分:1)

您可能会查看可用的CoAP实现,请参阅coap.technology以获取概述。尽管我是Eclipse/Californium(Java中的CoAP / DTLS实现)的提交者,但我还是建议尝试一下。

CoAP还定义了HTTP的跨代理。 google cloud tutorials中提供了一个示例。它使用较旧的Californium版本作为基础。 Californium本身有一个更新代理实例(但不是适用于Google云的开箱即用),请参见Californium - Proxy2