在进行 POST 请求时,参数通常会作为请求正文的一部分作为application/x-www-form-urlencoded data 出现
POST /api/endpoint HTTP/1.1
Content-Type: application/x-www-form-urlencoded
key1=value1&key2=value2
在服务器上,您将使用 @POST 注释来表示端点用于 POST 请求。要获取参数值,您将使用@FormParam。有了上面的要求,你会做的
@POST
@Comsumes("application/x-www-form-urlencoded")
@Produces("application/xml")
public Response post(@FormParam("key1") String key1, @FormParam("key2") String key1) {}
对于 GET 请求,参数将作为 URL 的一部分以query string 的形式出现
GET /api/endpoint?key1=value1&key2=value2 HTTP/1.1
在服务器上,您将使用 @GET 来表示端点用于 GET 请求。您将使用 @QueryParam 注释获取参数值
@GET
@Produces("application/xml")
public Response get(@QueryParam("key1") String key1, @QueryParam("key2") String key1) {}
何时使用查询参数和表单参数取决于具体情况。通常,当您尝试向服务器提交/发送数据时,您会使用表单参数。例如,您要保存有关新用户的信息。您将发送一个 POST 请求,其中包含作为表单参数发送的数据。当您尝试从服务器检索信息时,您通常使用查询参数,并将查询参数服务器用作某种过滤机制。例如,您想要获取用户列表,并且只想获取前 10 个用户。您可以使用 URL /api/users?limit=10 中的 limit=10 参数向用户端点发出 GET 请求
如果你想发送 XML 数据,你不想使用表单参数。您在代码中显示的内容就好像您正在尝试在表单参数中发送 XML 数据,例如
POST /api/endpoint HTTP/1.1
Content-Type: application/x-www-form-urlencoded
xmlrequest=<user>Paul</user>
当你这样做时
public void doPost(HttpServletRequest req, HttpServletResponse res) {
String reqXml = req.getParameter("xmlrequest");
}
那么reqXml 的值就是XML 字符串<user>Paul</user>。这很奇怪,不是你应该这样做的。 XML 应作为主要请求正文发送,Content-Type 应为application/xml。
POST /api/endpoint HTTP/1.1
Content-Type: application/xml
<user>Paul</user>
要在 servlet 中获取数据,您需要读取输入流。 getParameter() 无法获取数据
public void doPost(HttpServletRequest req, HttpServletResponse res) {
InputStream xmlStream = req.getInputStream();
String xml = readStream(xmlStream);
}
在 JAX-RS 端点中,您可以简单地通过使用 String 参数来获取整个 XML 字符串
@POST
@Consumes("application/xml")
@Produces("application/xml")
public Response post(String xmlString) {}
对于最后一个请求,xmlString 的值将是 <user>Paul</user>。
在 JAX-RS 中使用 XML 时,通常您将使用 POJOs。假设你有这个 XML
<User>
<firstName>Jane</firstName>
<lastName>Doe</lastName>
</User>
我们要做的是将它映射到 POJO,将不同的 XML 元素和属性映射到 POJO 属性。比如上面的 Xml,我们会映射到下面的 POJO
@XmlRootElement
public class User {
private String firstName;
private String lastName;
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public String getLasttName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
}
现在在我们的资源方法中,我们可以只接受 User 作为参数
@POST
@Consumes("application/xml")
@Produces("application/xml")
public Response post(User user) {
return user;
}