我有一个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();
}
}
}
答案 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。