簡體   English   中英

如何在JAX-RS中向GET請求添加主體

[英]How to add a body to a GET request in JAX-RS

我正在嘗試使用需要具有GET請求的正文的REST API。 但由於GET通常沒有身體,我找不到在我的請求中附加身體的方法。 我也在構建REST API,但教授不允許我們將方法更改為POST(他給了我們一個我們要創建的端點列表,不多也不少)。

我試着這樣做:

Response r = target.request().method(method, Entity.text(body));

我將method設置為GET ,將bodymy get body 但是,使用這種方法我得到一個例外:

javax.ws.rs.ProcessingException: RESTEASY004565: A GET request cannot have a body.

有沒有辦法用JAX-RS做到這一點? 我們學會了使用JAX-RS所以我更喜歡使用這個解決方案,因為我不確定我的教授會允許我們使用任何其他REST客戶端。 我目前正在使用WildFly服務器提供的RESTEasy。

(這不是HTTP GET與請求主體的重復,因為我在詢問如何在JAX-RS中使用body創建GET請求,而不是應該這樣做。)

這取決於您的JAX-RS實現。 可以使用SUPPRESS_HTTP_COMPLIANCE_VALIDATION屬性在Jersey 2.25中禁用此檢查:

ClientConfig config = new ClientConfig();
config.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
JerseyClient client = JerseyClientBuilder.createClient(config);
WebTarget target = client.target(URI.create("https://www.stackoverflow.com"));
Response response = target.request().method("GET", Entity.text("BODY HERE"));

而不是異常,您將獲得INFO日志

INFO: Detected non-empty entity on a HTTP GET request. The underlying HTTP transport connector may decide to change the request method to POST.

但是在RESTEasy 3.5.0.Final中, URLConnectionEngineApacheHttpClient4Engine都有一個硬編碼檢查:

if (request.getEntity() != null)
{
  if (request.getMethod().equals("GET")) throw new ProcessingException(Messages.MESSAGES.getRequestCannotHaveBody());

您必須創建自己的ClientHttpEngine實現才能跳過此步驟。 然后你需要在構建客戶端時提供它:

ClientHttpEngine engine = new MyEngine();
ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build();

暫無
暫無

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

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