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

标签 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();
        }
    }
}

最佳答案

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

是的。 (见下文)

能否通过 UDP 调用现有的 RESTful 服务?

可能不会。当然也需要大量的工作。


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

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

问题是找到一个同时支持 RESTful UDP 和(传统的)RESTful HTTP 的服务框架。

还有一些其他的实际问题:

  • UDP 不可靠,如果您发送的数据报不适合具有默认 MTU(1500 字节)的数据包,则情况会更加严重。因此,如果您想通过 UDP 实现 RESTful 服务,则需要密切注意请求和响应负载的大小。

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

如果你想追求这个,寻找一个实现 CoAP 的 RESTful 框架。 (受限应用协议(protocol) - RFC 7252)和 DTLS。

关于java - 我们可以对 REST 服务进行 UDP 调用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48719740/

相关文章:

java - 异常和网络服务

java - Google guava iterables.filter,与泛型相关的类型错误?

java - 从 Long id 生成唯一哈希

rest - 如何参数化 Bamboo 构建?

spring - 是否可以将 Spring Data Rest 配置为使用 id 作为引用而不是 URI?

wpf - 如何在 WPF 中使用 SSL Web 服务。 WPF如何下载SSL证书

用于商业用途的 Java 机器学习库?

java - 寻找支持 getKeysForValue 的 Java Map 实现

asp.net - 在与 ASP.Net 应用程序相同的端口上启动 .Net Web 服务

c# - WCF 和 SOAP 1.1