簡體   English   中英

我們可以對 REST 服務進行 UDP 調用嗎

[英]Can we make a UDP call to REST service

我有一個 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 級數據包將具有錯誤的協議族,服務的操作系統不會將它們路由到服務。

但是,(從技術上講)可以通過任何能夠發送消息的傳輸實現 RESTful 服務。 REST 原則與傳輸協議無關。

該問題將被找到服務框架支持的RESTful UDP(常規)的RESTful HTTP同時

還有一些其他的實際問題:

  • UDP 是不可靠的,如果您發送的數據報不適合具有默認 MTU(1500 字節)的數據包,則情況會更加嚴重。 因此,如果您想通過 UDP 實現 RESTful 服務,則需要密切注意請求和響應負載的大小。

  • HTTPS 使用 TLS,以便客戶端能夠驗證服務器的真實性,然后發送加密數據。 UDP 上的 TLS 是可能的(稱為DTLS )並由 JCSE 支持,但在典型的 RESTful / HTTP 框架中使用它可能具有挑戰性。

如果您想追求這一點,請尋找實現CoAP (受限應用程序協議 - RFC 7252)和 DTLS 的 RESTful 框架。

您可以查看可用的 CoAP 實現,請參閱coap.technology以獲得概述。 盡管我是Eclipse/Californium (Java 中的 CoAP/DTLS 實現)的提交者,但我建議您嘗試一下。

CoAP 還定義了 HTTP 的交叉代理。 谷歌雲教程中提供了一個示例。 它使用較舊的 Californium 版本作為基礎。 Californium 本身有一個更新代理示例(但不是開箱即用的可用於谷歌雲),請參閱Californium - Proxy2

是的,現在有一個基於 UDP 的 REST 的互聯網標准,它的名稱是受約束的應用程序協議 - CoAP CoApp 是在一系列互聯網標准中定義的,從RFC 7252開始。

CoAP 解決了早先對該問題的回答中提出的問題,包括使用 UDP 上的重傳使其可靠,並使用 DTLS 提供安全性。

CoAP 設計用於低至 10 KiB RAM 和 100 KiB 代碼空間的微控制器 ( RFC 7228 )。 此外,它使用 4 字節的二進制固定標頭和可變長度選項(如可選的 HTTP 標頭)為 UDP 數據包增加了很少的開銷

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM