Будьте уверены - невозможно выполнить POST с параметрами и телом

Я тестирую REST api с помощью Rest Assured. Я столкнулся с ошибкой при попытке выполнить POST как с параметром в URL-адресе, так и с основным содержимым. Это правильно работает при тестировании вручную. Удаление параметра из URL-адреса не является вариантом

Код теста:

String endpoint = http://localhost:8080/x/y/z/id?custom=test;
String body = "[{\"boolField\":true,\"intField\":991},
                {\"boolField\":false,\"intField\":998}]";
expect().spec(OK).given().body(body).post(endpoint);

Что вызывает следующую ошибку при запуске

You can either send parameters OR body content in the POST, not both!

java.lang.IllegalStateException: You can either send parameters OR body content in the POST, not both!
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77)
at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:102)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:198)
at com.jayway.restassured.internal.RequestSpecificationImpl.sendRequest(RequestSpecificationImpl.groovy:282)
at com.jayway.restassured.internal.RequestSpecificationImpl.this$2$sendRequest(RequestSpecificationImpl.groovy)
at com.jayway.restassured.internal.RequestSpecificationImpl$this$2$sendRequest.callCurrent(Unknown Source)
at com.jayway.restassured.internal.RequestSpecificationImpl.post(RequestSpecificationImpl.groovy:83)
...

Почему Rest Assured не допускает использование параметров и содержимого тела в POST-запросе?


person Jake Walsh    schedule 23.08.2012    source источник
comment
Я использую Rest Assured 1.1.6, который довольно старый. Однако, глядя на код на github это все еще кажется проблемой   -  person Jake Walsh    schedule 24.08.2012
comment
Я не знал, что у вас могут быть параметры Post и тело, поэтому, возможно, создатели Rest Assured тоже этого не сделали. Вы сами пробовали собрать Rest Assured и прокомментировать этот чек?   -  person mercutio    schedule 24.08.2012
comment
создали проблему для спокойного: код. google.com/p/rest-assured/issues/   -  person Jake Walsh    schedule 28.08.2012


Ответы (3)


Вам нужно указать параметр как queryParameter, а не «param» или «параметр». Param для POST по умолчанию будет формировать параметры, которые отправляются в теле запроса.

I.e.

given().
        queryParam("name, "value").
        body(..).
when().
        post(..);
person Johan    schedule 28.08.2012
comment
Также, если вы используете 1.1.6, я думаю, что произошла ошибка, когда параметры, которые вы указали в URL-адресе запроса, обрабатывались как параметры формы, а не параметры запроса для POST. Это было исправлено очень давно. Вам действительно стоит перейти на более новую версию. - person Johan; 28.08.2012

Я не слишком хорошо знаком с функцией «спокойствие», но вы сможете перенести эти параметры в тело. Вот как работают типичные параметры POST. Параметры как часть URL-адреса запроса обычно выполняются только для GET. Может попробовать сделать "custom = test" первой строчкой тела?

person Joe K    schedule 23.08.2012
comment
К сожалению, удалить параметр из URL-адреса нельзя. - person Jake Walsh; 24.08.2012

Вы должны указать параметры как queryParam. Вот пример:

RequestSpecification request=new RequestSpecBuilder().build();
ResponseSpecification response=new ResponseSpecBuilder().build();
@Test
public void test(){
  User user=new User();
  given()
  .spec(request)
  .queryParam(query_param1_name, query_param1_name_value)
  .queryParam(query_param2_name, query_param2_name_value)
  .contentType(ContentType.JSON)
  .body(user)
  .post(API_ENDPOINT)
  .then()
  .statusCode(200).log().all();

}

person Nitin Pawar    schedule 28.03.2017