2012-08-23 11 views
6

Ich teste eine REST API mit Rest Assured. Ich habe einen Fehler beim Versuch, sowohl mit einem Parameter im URL- als auch im Body-Inhalt POST zu senden. Dies funktioniert beim manuellen Testen korrekt. Das Entfernen der Parameter die URL bilden, ist keine OptionRest Assured - kann nicht mit Parametern und Körper POST

Testcode:

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

, das die folgenden Fehler auslöst, wenn

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

Warum Rest nicht funktioniert Assured zulassen, dass beide Parameter und Körpergehalt Ein Eintrag?

+0

Im mit dem Rest zugesichert 1.1.6, die ziemlich alt ist. Betrachtet man jedoch den Code auf [github] (https://github.com/jayway/rest-sured/blob/master/rest-assured/src/main/groovy/com/jayway/restassured/internal/RequestSpecificationImpl.groovy) Dies scheint immer noch ein Problem zu sein –

+0

Ich wusste nicht, dass Sie Post-Parameter und einen Körper haben könnten, also vielleicht auch die Schöpfer von Rest Assured nicht. Hast du selbst versucht, Rest Assured zu bauen und diesen Check zu kommentieren? – mercutio

+0

erstellt ein Problem für die Ruhe: http://code.google.com/p/rest-assured/issues/detail?id=196&thanks=196&ts=1346105863 –

Antwort

16

Sie müssen den Parameter als queryParameter und nicht als "param" oder "parameter" angeben. Param for POST bildet standardmäßig die Parameter, die im Anfragetext gesendet werden.

I.e.

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

Auch wenn Sie 1.1.6 verwenden, gibt es einen Fehler, bei dem die Parameter, die Sie in der Abfrage-URL angegeben haben, als Formularparameter und nicht als Abfrageparameter für POST behandelt wurden. Das wurde vor langer Zeit behoben. Sie sollten wirklich auf neuere Version aktualisieren. – Johan

0

Ich bin nicht vertraut mit Ruhe, aber Sie sollten in der Lage sein, diese Parameter auf den Körper zu verschieben. So funktionieren typische POST-Parameter. Das Bereitstellen von Parametern als Teil der Anforderungs-URL wird normalerweise nur für GET durchgeführt. Vielleicht versuchen Sie "custom = test" die erste Zeile des Körpers?

+0

Leider ist das Entfernen des Parameters aus der URL keine Option. –

0

Sie müssen Parameter als queryParam angeben. Hier ist das Beispiel:

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

}

Verwandte Themen