2012-08-23 23 views
6

Tôi đang thử nghiệm một REST api bằng Rest Restured. Tôi đang gặp lỗi khi cố gắng POST với cả tham số trong url và nội dung nội dung. Điều này hoạt động chính xác khi kiểm tra thủ công. Loại bỏ tham số hình url không phải là một lựa chọnPhần còn lại được bảo đảm - không thể POST với các tham số và nội dung

Mã kiểm tra:

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

nào ném được lỗi sau khi chạy

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

Tại sao yên tâm không cho phép cả hai thông số và nội dung cơ thể một POST?

+0

Im sử dụng yên tâm 1.1.6, mà là khá cũ. Tuy nhiên, hãy xem mã trên [github] (https://github.com/jayway/rest-assured/blob/master/rest-assured/src/main/groovy/com/jayway/restassured/internal/RequestSpecificationImpl.groovy) điều này vẫn có vẻ là một vấn đề –

+0

Tôi không biết bạn có thể có thông số Đăng bài và nội dung nên có thể những người sáng tạo của Rest Assured cũng vậy. Bạn đã thử xây dựng phần còn lại Đảm bảo bản thân và bình luận ra kiểm tra này? – mercutio

+0

đã tạo sự cố để yên tâm: http://code.google.com/p/rest-assured/issues/detail?id=196&thanks=196&ts=1346105863 –

Trả lời

16

Bạn cần chỉ định thông số là queryParameter chứ không phải tham số "param" hoặc "parameter". Tham số cho POST sẽ mặc định để tạo thành các tham số được gửi trong phần thân yêu cầu.

I.e.

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

Ngoài ra nếu bạn đang sử dụng 1.1.6 Tôi nghĩ rằng có lỗi trong đó các thông số bạn chỉ định trong URL truy vấn được coi là tham số biểu mẫu chứ không phải tham số truy vấn cho POST. Điều này đã được sửa chữa một thời gian dài trước đây. Bạn thực sự nên cập nhật lên phiên bản mới hơn. – Johan

0

Tôi không quá quen thuộc với sự yên tâm, nhưng bạn sẽ có thể di chuyển các thông số đó vào cơ thể. Đó là cách các tham số POST điển hình hoạt động. Việc có tham số như một phần của URL yêu cầu thường chỉ được thực hiện cho GET. Có thể thử làm "custom = test" dòng đầu tiên của cơ thể?

+0

Thật không may, việc xóa tham số khỏi URL không phải là một tùy chọn. –

0

Bạn phải chỉ định tham số là queryParam. Dưới đây là ví dụ:

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

}

Các vấn đề liên quan