簡體   English   中英

發送一個空字符串作為RequestBody不會到達Rest終結點

[英]Sending an Empty String as RequestBody not hitting the Rest endpoint

我正在嘗試為端點編寫一個unitTest。

該終結點應采用json對象,如下所示

@PostMapping(value = "/test")
public String endPoint(@RequestBody String obj) {

        try {
          JSONObject inputJsonObject = new JSONObject(individualJson);
        } catch (JSONException | IOException e) {
                    throw new MyException("JSONObject not valid");
        }
 ......
 }

在我的單元測試中,我試圖發送一個空字符串,並且我希望有一個JSONException

mvc.perform(post(url)
                .contentType(MediaType.APPLICATION_JSON)
                .content(""))
                .andReturn().getResponse();

但是,我的帖子沒有觸及我的端點...這就像它無法將空字符串評估為字符串:“”沒有觸及端點,而“”(帶有空格)觸及端點...

這是調用返回的異常:

org.springframework.http.converter.HttpMessageNotReadableException:缺少必需的請求正文:public com.ba.mypackage.MyController.endPoint(java.lang.String)

如何通過傳遞空字符串“”訪問端點?

您不能這樣做,因為將空字符串作為正文發送與在這種情況下不發送正文是相同的事情,並且@RequestBody批注禁止不發送正文,因為其required屬性的默認值為true

將空字符串作為正文發送與不發送正文相同,因為在HTTP中,POST請求的標頭部分和正文部分之間用CRLF分隔,並且在擁有正文和不包含正文時都需要分隔CRLF。 這是HTTP規范中定義的方式,有關詳細信息,請參見https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html

5個要求

從客戶端到服務器的請求消息在該消息的第一行中包括要應用於資源的方法,資源的標識符以及所使用的協議版本。

    Request       = Request-Line              ; Section 5.1
                    *(( general-header        ; Section 4.5
                     | request-header         ; Section 5.3
                     | entity-header ) CRLF)  ; Section 7.1
                    CRLF
                    [ message-body ]          ; Section 4.3

您提供的標頭部分和正文是您希望具有的空字符串。 但是,無論如何,您都需要有CRLF,因此請求看起來像這樣:

POST /url HTTP/1.1
Content-Type: application/json; charset=UTF-8
Accept: application/json, application/javascript, text/javascript
Content-Length: 0
Host: localhost:8888
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_112)
Accept-Encoding: gzip,deflate
 

或者,將[CRLF]放在該字符所在的位置,

POST /url HTTP/1.1[CRLF]
Content-Type: application/json; charset=UTF-8[CRLF]
Accept: application/json, application/javascript, text/javascript[CRLF]
Content-Length: 0[CRLF]
Host: localhost:8888[CRLF]
Connection: Keep-Alive[CRLF]
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_112)[CRLF]
Accept-Encoding: gzip,deflate[CRLF]
[CRLF]

由於content-length為零,並且CRLF分隔符必須始終存在,所以您如何區分以正文形式發送的空字符串和根本沒有正文發送的字符串之間的區別? 事情是你做不到,在這種情況下,這是同一件事,所以你的要求無法完成。

因為空字符串不是有效的字符串,所以與Null相似。

但是,如果您只想點擊控制器,而對控制器內部的空字符串值不感興趣,則只需將該參數標記為可選即可。

public String endPoint(@RequestBody(required = false) String obj) {

我可以建議兩種方法來傳遞空字符串。

  1. 最好將空字符串分配給最終變量,如下所述。

     private static final String YOUR_STRING = ""; 
  2. 您也可以使用StringBuffer傳遞空字符串。

暫無
暫無

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

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