Documentation

§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(Http.Request request) {
  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(Http.Request request) {
  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(Http.Request request) {
  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.