# Handling and serving XML requests ## Handling an XML request An XML request is an HTTP request using a valid XML payload as the request body. It must specify the `text/xml` MIME type in its `Content-Type` header. By default an `Action` uses a **any content** body parser, which lets you retrieve the body as XML (actually as a `NodeSeq`): ```scala def sayHello = Action { request => request.body.asXml.map { xml => (xml \\ "name" headOption).map(_.text).map { name => Ok("Hello " + name) }.getOrElse { BadRequest("Missing parameter [name]") } }.getOrElse { BadRequest("Expecting Xml data") } } ``` It’s way better (and simpler) to specify our own `BodyParser` to ask Play to parse the content body directly as XML: ```scala def sayHello = Action(parse.xml) { request => (request.body \\ "name" headOption).map(_.text).map { name => Ok("Hello " + name) }.getOrElse { BadRequest("Missing parameter [name]") } } ``` > **Note:** When using an XML body parser, the `request.body` value is directly a valid `NodeSeq`. You can test it with **cURL** from a 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 handle an XML request, but we reply with a `text/plain` response. Let’s change that to send back a valid XML HTTP response: ```scala def sayHello = Action(parse.xml) { request => (request.body \\ "name" headOption).map(_.text).map { name => Ok(Hello {name}) }.getOrElse { BadRequest(Missing parameter [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 | ScalaFileUpload]]