Documentation

You are viewing the documentation for the 2.6.x release series. The latest stable release series is 3.0.x.

§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 application/xml or 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 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(BodyParser.Xml.class)
public Result sayHelloBP() {
  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: application/xml" 
  --request POST 
  --data '<name>Guillaume</name>' 
  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(BodyParser.Xml.class)
public Result replyHello() {
  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("<message \"status\"=\"KO\">Missing parameter [name]</message>")
          .as("application/xml");
    } else {
      return ok("<message \"status\"=\"OK\">Hello " + name + "</message>").as("application/xml");
    }
  }
}

Now it replies with:

HTTP/1.1 200 OK
Content-Type: application/xml; charset=utf-8
Content-Length: 46

<message status="OK">Hello Guillaume</message>

Next: Handling file upload


Found an error in this documentation? The source code for this page can be found here. After reading the documentation guidelines, please feel free to contribute a pull request. Have questions or advice to share? Go to our community forums to start a conversation with the community.