Опубликовать пустое тело с помощью клиента Jersey 2

Как отправить запрос на публикацию с пустым телом с помощью клиента Джерси 2?

final MyClass result = ClientBuilder.newClient()
    .target("http://localhost:8080")
    .path("path")
    .queryParam("key", "value")
    .request(APPLICATION_JSON)
    .post(What to fill in here if the body should be left empty??, MyClass.class);

Обновление: это работает:

final MyClass result = ClientBuilder
    .newBuilder().register(JacksonFeature).build()
    .target("http://localhost:8080")
    .path("path")
    .queryParam("key", "value")
    .request(APPLICATION_JSON)
    .post(null, MyClass.class);

person Stine    schedule 14.12.2013    source источник
comment
Я опаздываю на вечеринку, но FWIW ваше обновление является ответом на мою конкретную проблему - в частности, мне не нужен заголовок Content-Type :)   -  person Oliver Charlesworth    schedule 13.06.2017


Ответы (5)


Я нигде не могу найти это в документе, но я считаю, что вы можете использовать null для получения пустого тела:

final MyClass result = ClientBuilder.newClient()
    .target("http://localhost:8080")
    .path("path")
    .queryParam("key", "value")
    .request(APPLICATION_JSON)
    .post(Entity.json(null), MyClass.class)
person Alden    schedule 14.12.2013
comment
Я пробовал, но получил MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json,...? - person Stine; 15.12.2013
comment
Ну, это совсем другая проблема... вы должны либо зарегистрировать JacksonFeature по умолчанию, либо написать свой собственный MessageBodyWriter/Reader. - person Alden; 15.12.2013
comment
Ах, я вижу, вы написали это выше, извините. Итак, null правильный ответ, верно? - person Alden; 15.12.2013
comment
Это глупо. Должен быть статический метод Enity.empty() - person Shervin Asgari; 18.03.2015
comment
Проблема с этим подходом заключается в том, что jersey по-прежнему будет устанавливать заголовок типа контента в соответствии с Entity-factory (в данном случае application/json). - person Hank; 16.07.2015
comment
Это работает, но я считаю, что он не отправляет заголовок Content-Length: 0 ... некоторые конечные точки, по-видимому, требуют Content-Length, если вы отправляете POST. Есть ли способ добавить заголовок вручную? - person Kevin Hooke; 10.12.2015
comment
Вы можете добавить заголовки между запросом и отправкой вызовов, если вам нужно: .request(APPLICATION_JSON).header(HttpHeaders.CONTENT_LENGTH, 0).post(Entity.json(null), MyClass.class) - person Alden; 07.04.2016
comment
Как указывает @Hank, это сделает запрос с Content-Type установленным на application/json, что может быть не тем, что вам нужно. Если вы хотите отправить пустую форму, попробуйте post(Entity.form(new Form())) - person michiakig; 20.03.2017
comment
Это не работает для меня. Entity.json() работает нормально. - person K. Gol; 03.09.2019

Я обнаружил, что это сработало для меня:

Response r = client
    .target(url)
    .path(path)
    .queryParam(name, value)
    .request()
    .put(Entity.json(""));

Передайте пустую строку, а не нулевое значение.

person Gapmeister66    schedule 15.09.2016

Я не знаю, изменила ли его версия. Но следующее не работает:

builder.put( Entity.json( null ) );

Где следующее работает нормально:

builder.put( Entity.json( "" ) );

person roanbaga    schedule 25.06.2016
comment
Это сработало для меня. Я пытался провести модульный тест, где значение параметра отображается как null. Я попробовал предложенный ответ Entity.json("{}"), но это дало мне параметр с экземпляром с каждым полем null, а не параметр, который я хотел. - person Chris R; 14.11.2019

Просто опубликуйте пустой текст.

   .post(Entity.text(""));
person Emmanuel Osimosu    schedule 09.05.2017

У меня это работало только с пустой строкой объекта json

.post(Entity.json("{}")

Все остальные решения, все еще производимые 400 Bad Request

P.S. Запрос выполняется с помощью MediaType.APPLICATION_JSON

person Michael    schedule 22.03.2018