Learn to send requests with XML request body and validate the response using REST-assured APIs.
1. By Parsing Custom Object to XML
1.1. Parsing Java Object to XML
If we can take the help of libraries such as Jackson or JAXB, for converting a custom object into XML String, it should be the preferred way. It helps in making the code more readable and manageable.
For example, if we have an API that takes the following request:
HTTP POST /users
<user>
<name>lokesh</name>
<email>admin@howtodoinjava.com</email>
<gender>male</gender>
<status>active</status>
</user>
We can create a Java object UserObject and annotate it with Jackson annotations so that it parses to the desired XML string.
@JacksonXmlRootElement(localName = "user")
class UserObject {
@JsonInclude(JsonInclude.Include.NON_NULL)
private Integer id;
private String name;
private String email;
private String gender;
private String status;
}
Now, we can use Jackson’s XmlMapper.writeValueAsString() method to get the XML string for the UserDTO instance. This will generate the XML as given previously.
UserObject newUser = new UserObject();
newUser.setName("lokesh");
newUser.setEmail("admin@howtodoinjava.com");
newUser.setGender("male");
newUser.setStatus("active");
String newUserXml = new XmlMapper().writeValueAsString(newUser);
1.2. Sending Request with REST-assured
Sending the XML request body is very simple. We need to set the content type to “application/xml” (or any other custom mediatype, if any) and then pass the XML string to the given().body(xml) method.
A complete example of sending the XML request to a POST API is:
@Test
public void createUserWithJSONObject_thenSuccess()
throws JSONException, JsonProcessingException {
UserObject newUser = new UserObject();
newUser.setName("lokesh");
newUser.setEmail("admin@howtodoinjava.com");
newUser.setGender("male");
newUser.setStatus("active");
String newUserXml = new XmlMapper().writeValueAsString(newUser);
given()
.body(newUserXml)
.contentType("application/xml")
.queryParam("access-token", "xxxx")
.when()
.post("/users")
.then()
.statusCode(201)
.body("id", notNullValue())
.body("name", equalTo("lokesh"))
.body("gender", equalTo("male"))
.body("status", equalTo("active"))
.body("email", equalTo("admin@howtodoinjava.com"))
.log().all();
}
2. By Reading XML from File
In automation testing, we may not have created DTO objects, and we may need to rely on hardcoded XML strings. In this case, creating such XML strings in separate XML files that are API specific is always better.
We read the XML file for each API and post its content to the API. In this approach, only obtaining the XML string is different and invoking the API is the same as the previous example.
File newUserXmlFile = new File("src/test/resources/requests/newUser.xml");
given()
.body(newUserXmlFile)
...
.when()
.post("/users")
.then()
...;
3. Conclusion
This short tutorial taught us to pass the XML requests to REST APIs using REST-assured. We learned to get the XML request strings from either custom Java objects or XML files in the filesystem. Then we learned to pass the XML to the API and validate the response.
Happy Learning !!
Hope you are doing well.
Thank you, the second method suits to my requirement of reading the XML File. However here using the above code, the body shows the content as the FILEPATH and not the File Content.
Any other way to read this XML file and use it in the Body.
I tried converting XML to JSON which partially worked. But as the API doesn’t accept JSON format, we have to rely on either XML or TEXT. Preferably XML.
Appreciate your assistance.
Can you please share the code you are using?