【问题标题】:Equivalent POST and GET from HttpServlet to REST [closed]从 HttpServlet 到 REST 的等效 POST 和 GET [关闭]
【发布时间】:2018-08-15 17:10:49
【问题描述】:

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

【问题讨论】:

  • 我在研究中表现出了努力,写了一个明确的具体问题并展示了我的工作,但我仍然得到了两个反对票。

标签: java rest servlets jax-rs


【解决方案1】:

在进行 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 字符串&lt;user&gt;Paul&lt;/user&gt;。这很奇怪,不是你应该这样做的。 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 的值将是 &lt;user&gt;Paul&lt;/user&gt;

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

【讨论】:

  • 太好了,你!当我将它添加为 @QueryParam 时,这对我有用
猜你喜欢
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
相关资源
最近更新 更多