# Handling and serving XML requests ## Handling an XML request An XML request is an HTTP request using a valid XML payload as request body. It must specify the `text/xml` MIME type in its `Content-Type` header. By default, an action uses an **any content** body parser, which you can use to retrieve the body as XML (actually as a `org.w3c.Document`): ``` public static Result sayHello() { Document dom = request().body().asXml(); if(dom == null) { return badRequest("Expecting Xml data"); } else { String name = XPath.selectText("//name", dom); if(name == null) { return badRequest("Missing parameter [name]"); } else { return ok("Hello " + name); } } } ``` Of course it’s way better (and simpler) to specify our own `BodyParser` to ask Play to parse the content body directly as XML: ``` @BodyParser.Of(Xml.class) public static Result sayHello() { Document dom = request().body().asXml(); if(dom == null) { return badRequest("Expecting Xml data"); } else { String name = XPath.selectText("//name", dom); if(name == null) { return badRequest("Missing parameter [name]"); } else { return ok("Hello " + name); } } } ``` > **Note:** This way, a 400 HTTP response will be automatically returned for non-XML requests. You can test it with **cURL** on the command line: ``` curl --header "Content-type: text/xml" --request POST --data 'Guillaume' http://localhost:9000/sayHello ``` It replies with: ``` HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 Content-Length: 15 Hello Guillaume ``` ## Serving an XML response In our previous example, we handled an XML request, but replied with a `text/plain` response. Let’s change it to send back a valid XML HTTP response: ``` @BodyParser.Of(Xml.class) public static Result sayHello() { Document dom = request().body().asXml(); if(dom == null) { return badRequest("Expecting Xml data"); } else { String name = XPath.selectText("//name", dom); if(name == null) { return badRequest("Missing parameter [name]"); } else { return ok("Hello " + name + ""); } } } ``` Now it replies with: ``` HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: 46 Hello Guillaume ``` > **Next:** [[Handling file upload | JavaFileUpload]]