inceleyelim:
given().contentType(ContentType.JSON).body("{\"key\": \"val\"}").
when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal));
Burada yapılan budur istek gövdesine (metin gibi) { "key" : "val" }
koymak olmasıdır. Bu metin JSON olur. REST Assured'in bakış açısıyla, geçerli bir JSON olmayan { "key" : "val"
'u koyabilirsiniz. Sunucu, sunucusu JSON gerektirdiğinden ve anladığından bu yana doğru yanıt verir. JSON'u içerik türü olarak geçirdiğinizden bu yana, gövdenin JSON olması gerektiğini anlar.
Öyleyse şimdi de ikinci örneğe bakalım:
given().parameter("key", "val").
when().post(url + resource).then().assertThat().statusCode(200);
Burada JSON içerik türü eksik çünkü servis 415 döndürür. param
veya parameter
'u POST
ile kullandığınızda, form parametreleri oluşturmanızdır. Form parametreleri de istek gövdesine gönderilir. BUT form parametreleri JSON değildir!
given().contentType("x-www-form-urlencoded").body("key=val").when().url + resource).then().assertThat().statusCode(200);
Yani ikinci örnekte aslında iki sorun var: senin gibi form parametresi olarak "anahtar" ve "val" belirtme bu aynı olacaktır Sen JSON göndermiyoruz
- sen
Ve çünkü yanlış içerik türüne sahip (2) sunucudan 415 olsun
Üçüncü örneğe üzerinde taşıma:
given().parameter("key", "val").
when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
(muhtemelen) burada olur o içerik olarak "application/json" dahil etmek isteğini bekler çünkü sunucu bir yanıt gövdesi yok ki ne
tipi. Yani iddia edecek bir beden yok (istek yanlış)! Yanıt sadece başlık olarak 415 durumunu (satır) içerir. Son örnek götürür
:
İşte
RestAssured.defaultParser = Parser.JSON;
given().parameter("key", "val").
when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
Eğer JSON ama (yine) sorun olarak eksik içerik türü tedavi etmek İçiniz rahat talimat sunucu değil yapmasıdır Herhangi bir cevap gövdesini geri döndürün, bu yardımcı olmaz.
Çözüm:
You should desteklenen bir JSON nesnesi-haritalama çerçeve koymak (Jackson, Daha Hızlı Jackson, Basit JSON veya GSON) Sınıfyolu (örneğin jackson-databind
için) ve açıklandığı gibi sadece bir harita oluşturmak documentation:
given().
contentType(ContentType.JSON).
body(new HashMap<String,Object>() {{
put("key1, "val1");
put("key2, "val2");
put("key3", asList("val3", "val4"));
put("nested", new HashMap<String,String>() {{
put("key4", "val4");
put("key5", "val5");
}});
}}).
when().
post(url + resource).
then().
statusCode(200).
body("otherVal", equalTo(otherVal));
:
Map<String, Object> jsonAsMap = new HashMap<>();
map.put("key", "val");
given().
contentType(ContentType.JSON).
body(jsonAsMap).
when().
post(url + resource).
then().
statusCode(200).
body("otherVal", equalTo(otherVal));
Java haritalar oluşturulması beri haritalar iç içe varsa ayrıntılı genellikle böyle bir şey yapmak oldukça olduğunu
Yoksa verilerinizin DTO gösterimini oluşturmak ve sadece bir nesne geçmek emin olmasına:
MyDTO myDTO = new MyDTO(...);
given().
contentType(ContentType.JSON).
body(myDTO).
when().
post(url + resource).
then().
statusCode(200).
body("otherVal", equalTo(otherVal));
Sen object-mapping documentation daha okuyabilir.
https://github.com/rest-assured/rest-assured/issues/744 iyi olmalıdır, 2. son yaklaşımda hata vardır. Benim için JSON'u dize olarak mükemmel bir şekilde çalıştı. İç içe geçmiş JSON – vikramvi