Отправка пустой строки как RequestBody не достигнет конечной точки Rest - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь написать 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)

Как я могу получить доступ к конечной точке, передав пустую строку ""?

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Я могу предложить два способа передачи пустой строки.

  1. Лучше назначить пустую строку конечной переменной, как указано ниже.

    private static final String YOUR_STRING = "";
    
  2. Вы также можете использовать StringBuffer для передачи вашей пустой строки.

0 голосов
/ 12 октября 2018

Вы не можете этого сделать, поскольку отправка пустой строки в качестве тела - это то же самое, что не отправка тела в этом контексте и не отправка тела запрещена аннотацией @RequestBody, поскольку значение по умолчанию для ее атрибута requiredis 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]

Поскольку длина содержимого равна нулю и разделитель CRLF всегда должен быть там, как бы вы сказали разницу между пустой строкой, отправленной как тело, и телом вообще не было отправлено?Дело в том, что вы не можете, в этом контексте это одно и то же, поэтому то, что вы просите, не может быть сделано.

0 голосов
/ 12 октября 2018

Поскольку пустая строка не является допустимой строкой и обрабатывается аналогично нулю.

Однако, если вы просто хотите поразить контроллер и не заинтересованы в значении пустых строк внутри контроллера, просто пометьте параметр как необязательный..

public String endPoint(@RequestBody(required = false) String obj) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...