代码之家  ›  专栏  ›  技术社区  ›  Robin

从HttpServlet到REST的等效POST和GET[关闭]

  •  -1
  • Robin  · 技术社区  · 6 年前

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

    这是我的代码:

    @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 回复  |  直到 6 年前
        1
  •  1
  •   Paul Samsotha    6 年前

    在执行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请求,参数将作为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) {}
    

    检索 从服务器获取信息,并将服务器查询参数作为某种过滤机制。例如,你想得到一个用户列表,而你只想得到前10个。您可以使用 limit=10 URL中的参数 /api/users?limit=10


    如果要发送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>
    

    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 会是 <用户>Paul</用户> .

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