Regardons à votre premier exemple:
given().contentType(ContentType.JSON).body("{\"key\": \"val\"}").
when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal));
Qu'est-ce qui se passe ici est que vous mettez { "key" : "val" }
(sous forme de texte) dans le corps de la demande. Ce texte arrive à être JSON. Du point de vue de REST Assured vous pourriez aussi bien mettre { "key" : "val"
qui n'est pas valide JSON. Votre serveur répond correctement car le serveur requiert et comprend JSON. Il comprend que le corps doit être JSON depuis que vous avez passé JSON en tant que type de contenu.
Alors regardons votre deuxième exemple:
given().parameter("key", "val").
when().post(url + resource).then().assertThat().statusCode(200);
Voici votre service retourne 415 parce que vous êtes absent le type de contenu JSON. Qu'est-ce qui se passe lorsque vous utilisez param
ou parameter
avec POST
est que vous créez des paramètres de formulaire. Les paramètres de formulaire sont également envoyés dans le corps de la requête MAIS les paramètres de formulaire ne sont pas JSON!Spécification « clé » et « val » en tant que paramètre de forme comme vous sera le même que celui-ci:
given().contentType("x-www-form-urlencoded").body("key=val").when().url + resource).then().assertThat().statusCode(200);
Donc, dans votre deuxième exemple, il y a en fait deux problèmes:
- Vous n'êtes pas envoyer JSON
- vous avez le mauvais type de contenu
Et à cause de (2), vous obtenez 415 du serveur
Passons à votre troisième exemple:
given().parameter("key", "val").
when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
Qu'est-ce que (probablement) se produit ici est que votre serveur ne contient pas de corps de la réponse car il attend la demande d'inclure « application/json » en tant que contenu -type. Il n'y a donc pas de corps à affirmer (la demande est fausse)! La réponse contient uniquement l'état 415 (ligne) en tant qu'en-tête.
Ce qui nous conduit à votre dernier exemple:
RestAssured.defaultParser = Parser.JSON;
given().parameter("key", "val").
when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
Ici vous instruisez rassurez-vous pour traiter un type de contenu manquant JSON mais le problème (encore une fois) est que votre serveur ne fonctionne pas retourner tout corps de réponse du tout, cela ne va pas aider.
Solution:
Vous devriez mettre un cadre objet cartographique JSON pris en charge (Jackson, Jackson Plus rapide, simple JSON ou Gson) dans votre classpath (par exemple jackson-databind
) et il suffit de créer une carte comme décrit dans la documentation:
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));
Depuis la création de cartes en Java est tout à fait que je fais habituellement bavard quelque chose comme ça si je cartes imbriquées:
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));
Ou vous créez une représentation DTO de vos données et passez juste un objet à Rassurez-vous:
MyDTO myDTO = new MyDTO(...);
given().
contentType(ContentType.JSON).
body(myDTO).
when().
post(url + resource).
then().
statusCode(200).
body("otherVal", equalTo(otherVal));
Vous pouvez lire plus dans la object-mapping documentation.
https://github.com/rest-assured/rest-assured/issues/744, il y a bug dans 2 dernière approche. Pour moi passer JSON en tant que chaîne a parfaitement fonctionné. J'ai imbriqué JSON – vikramvi