文档

§处理和提供 XML 请求

§处理 XML 请求

XML 请求是使用有效 XML 负载作为请求正文的 HTTP 请求。它必须在 Content-Type 标头中指定 application/xmltext/xml MIME 类型。

默认情况下,操作使用 **任何内容** 体解析器,您可以使用它来检索正文作为 XML(实际上是 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);
    }
  }
}

当然,指定我们自己的 BodyParser 来让 Play 直接将内容正文解析为 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);
    }
  }
}

注意:这样,对于非 XML 请求,将自动返回 400 HTTP 响应。

您可以在命令行上使用 curl 测试它

curl 
  --header "Content-type: application/xml" 
  --request POST 
  --data '<name>Guillaume</name>' 
  http://localhost:9000/sayHello

它回复

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 15

Hello Guillaume

§提供 XML 响应

在我们之前的示例中,我们处理了 XML 请求,但回复了 text/plain 响应。让我们将其更改为发送回有效的 XML HTTP 响应

@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");
    }
  }
}

现在它回复

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

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

下一步:处理文件上传


在此文档中发现错误?此页面的源代码可以在 此处 找到。在阅读 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?转到 我们的社区论坛,与社区开始对话。