我试图了解将HttpServlet模仿为Restful Web服务的等效方法。
我有以下HttpServlet代码:
public class Servlet extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res) {
String reqXml = req.getParameter("xmlrequest");
}
public void doGet(HttpServletRequest req, HttpServletResponse res) {
String reqXml = req.getParameter("xmlrequest");
}
}
我正在尝试在REST中做同样的事情。
这是我的代码:
@GET
@Path("/getInfo")
@Produces(MediaType.APPLICATION_XML)
public Response getDetails(@Context HttpServletRequest request) {
String xmlRequest = request.getParameter("xmlrequest");
}
@GET
@Path("/getInfo")
@Produces(MediaType.APPLICATION_XML)
public Response getDetails(@FormParam("xmlrequest") String request) {
String xmlRequest = request.getParameter("xmlrequest");
}
答案 0 :(得分:1)
在进行POST请求时,参数通常作为application/x-www-form-urlencoded
数据作为请求正文的一部分出现
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请求,参数将以query string的形式作为URL的一部分出现
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 limit=10
/api/users?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;
}