我有一个 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/