从HttpServlet到REST的等效POST和GET

时间:2018-08-15 17:10:49

标签: java rest servlets jax-rs

我试图了解将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");
}

1 个答案:

答案 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;
}