Вообще говоря, HTTP POST предполагает, что содержимое тела содержит серию пар ключ / значение, которые создаются (чаще всего) формой на стороне HTML. Вы не устанавливаете значения с помощью setHeader, так как это не поместит их в тело содержимого.
Итак, в вашем втором тесте проблема, с которой вы здесь столкнулись, заключается в том, что ваш клиент не создает несколько пар ключ / значение, он только создал одну и по умолчанию сопоставляется первому аргументу в вашем методе.
Есть несколько вариантов, которые вы можете использовать. Во-первых, вы можете изменить свой метод так, чтобы он принимал только один входной параметр, а затем передать строку JSON, как во втором тесте. Оказавшись внутри метода, вы затем анализируете строку JSON в объект, который разрешает доступ к полям.
Другой вариант - определить класс, который представляет поля типов ввода, и сделать его единственным входным параметром. Например
class MyInput
{
String str1;
String str2;
public MyInput() { }
// getters, setters
}
@POST
@Consumes({"application/json"})
@Path("create/")
public void create(MyInput in){
System.out.println("value 1 = " + in.getStr1());
System.out.println("value 2 = " + in.getStr2());
}
В зависимости от используемой вами среды REST она должна обрабатывать десериализацию JSON за вас.
Последний вариант - создать тело POST, которое выглядит следующим образом:
str1=value1&str2=value2
затем добавьте некоторые дополнительные аннотации к вашему методу сервера:
public void create(@QueryParam("str1") String str1,
@QueryParam("str2") String str2)
@ QueryParam не заботится, находится ли поле в форме сообщения или в URL (например, запрос GET).
Если вы хотите продолжить использовать отдельные аргументы на входе, тогда ключом является генерация клиентского запроса на предоставление именованных параметров запроса, либо в URL (для GET), либо в теле POST.