2012-08-23 5 views
6

Estoy probando una APLICACIÓN REST usando Rest Assured. Me estoy encontrando con un error al intentar enviar con un parámetro tanto en la url como en el contenido del cuerpo. Esto funciona correctamente cuando se prueba manualmente. Extracción del parámetro formar la URL no es una opciónDescanso asegurado: no se puede POSTAR con los parámetros y el cuerpo

Código de prueba:

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); 

que arroja el siguiente error al ejecutar

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) 
... 

¿Por qué Descanso asegurado no permite que tanto los parámetros como el contenido del cuerpo de ¿una publicación?

+0

Im usando Tenga la seguridad de 1.1.6, que es bastante antiguo. Sin embargo, mirando el código en [github] (https://github.com/jayway/rest-assured/blob/master/rest-assured/src/main/groovy/com/jayway/restassured/internal/RequestSpecificationImpl.groovy) esto todavía parece ser un problema –

+0

No sabía que podría tener los parámetros de publicación y un cuerpo, por lo que tal vez los creadores de Rest Assured tampoco lo hicieron. ¿Intentó construir Rest Assured usted mismo y comentar este cheque? – mercutio

+0

ha creado un problema para rest-assured: http://code.google.com/p/rest-assured/issues/detail?id=196&thanks=196&ts=1346105863 –

Respuesta

16

Debe especificar el parámetro como queryParameter y no como "param" o "parameter". El parámetro para POST se configurará por defecto para formar parámetros que se envían en el cuerpo de la solicitud.

I.e.

given(). 
     queryParam("name, "value"). 
     body(..). 
when(). 
     post(..); 
+0

Además, si usa 1.1.6, creo que hubo un error en el que los parámetros que especificó en la URL de la consulta se trataron como parámetros de formulario y no para consultar los parámetros de POST. Esto fue arreglado hace mucho tiempo. Deberías actualizar a una versión más nueva. – Johan

0

No estoy muy familiarizado con el descanso seguro, pero debería poder mover esos parámetros al cuerpo. Así es como funcionan los parámetros típicos de POST. Tener parámetros como parte de la URL de solicitud generalmente solo se hace para GET. Tal vez intente hacer "personalizado = prueba" la primera línea del cuerpo?

+0

Desafortunadamente, eliminar el parámetro de la URL no es una opción. –

0

Debe especificar los parámetros como queryParam. Aquí está el ejemplo:

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(); 

}

Cuestiones relacionadas