2016-08-25 43 views
1

我的web服務(它是一個java servlet)接受帶有url參數的put請求來執行特定操作。下面的代碼得到我想要做的,但我很想知道是否有更好的方式來進行放置請求,而無需添加多部分主體。如何使用okhttp3發出請求(不帶多部分主體)

在Java Servlets中執行所有請求都需要多部分主體嗎?

做所有使用okhttp3提出的請求期望多部分機構?

我誤解別的東西嗎?

body = new MultipartBody.Builder() 
       .setType(MultipartBody.FORM) 
       .addFormDataPart("", "") // I would love to eliminate this. 
       .build(); 

    request = new Request.Builder() 
       .url(url + "?my_param=" + URLEncoder.encode(myParam, "utf-8")) 
       .put(body) 
       .build(); 

    response = client.newCall(request).execute(); 

回答

1

從實用主義角度來說,我會說,你看Servlet和/或OkHttp的實現限制,大概可以用做不同的庫工作。

然而,

從標準來看,我認爲你的做法是不正確的,你應該使用POST而不是PUT的。這需要在POST請求中讀取RFC-2616 (HTTP/1.1),第9.6節以及查詢字符串部分RFC-1630 (URL's in WWW)

從HTTP規範,部分9.6:

所述POST的根本區別和PUT請求反映在Request-URI中的不同的含義。 POST請求中的URI標識將處理封閉實體的資源。該資源可能是數據接受過程,其他協議的入口或接受註釋的獨立實體。相比之下,PUT請求中的URI標識請求附帶的實體 - 用戶代理知道URI的目標是什麼,服務器不能嘗試將請求應用於其他資源。

從URL的規格,第6頁:

查詢字符串

問號( 「?」,ASCII 3F十六進制)用於分隔可查詢的URI之間的邊界對象和一組用於表示對該對象的查詢的單詞。當使用這種形式時,組合的URI表示查詢應用於原始對象所產生的對象。

這兩個結合起來意味着你不能以你想要的方式使用PUT請求。

+0

謝謝。讓我看看,如果我得到這個,放置請求通常不打算用於查詢參數,就像是一個帖子?因此,在okhttp3中執行put請求時需要爲「封閉實體」設計一個請求主體? – tufenke

+0

關鍵是PUT告訴服務器「將<請求體>放在」處。而POST則以任何你認爲合適的方式告訴服務器「爲我處理」。 – Barend

相關問題