Servlet中的getParameter()方法对于表单数据返回null。

4
我正在向我的localhost Tomcat 8.0 Servlet 3.1 Web应用程序发送POST请求,但是request.getParameter("")返回null
以下是我的请求方式。 使用PostMan 我使用PostMan执行POST请求。在Java端,我调用request.getParameter("code"),这会给我返回null。同样的情况也适用于qwe字段。我没有使用任何框架,只是原始的servlets。这只是一个后端,所以它全部都是关于处理数据和响应客户端。
如果我使用"x-www-form-urlencoded",我可以通过getParameter()调用检索参数,但我仍然想知道为什么无法获取form-data
谢谢。

已经有一段时间了,但我非常确定form-data方法将请求内容存储在请求体中,这意味着您需要使用ReaderInputStream来获取它。 - cjstehno
@cjstehno 是的,getReader()readLine() 方法给了我一些数据,我能够在那里看到我的参数,但是我无法提取它,因为它有边界字符串并且需要单独处理(根据我所读的)。但是人们说这在 Servlet 3.0 及以上版本中已经处理过了。我正在使用 3.1 版本,但仍然无法获得它。有什么建议吗? - OmerHalit
我也无法使用 getPart("") 方法从表单数据中获取文件。 - OmerHalit
是的,它将是多部分数据,您需要使用类似JavaMail多部分库(或Apache FileUpload API)这样的东西来获取它,两者都有多部分实现,可以处理http多部分请求内容。但在您的情况下,包含的数据应该只是一个文本字符串的字节,格式化为多部分内容有效负载。 - cjstehno
@cjstehno 当我不发送文件,只发送字符串值时怎么办?它们仍然被处理为多部分数据吗?如何从servlet访问表单数据? - OmerHalit
你可以使用多部分正文内容来实现,但服务器会以不同的方式处理这种类型的请求。在我看来,“form-data”实际上是一个误称,因为它实际上是多部分数据,而“x-www-form-urlencoded”才是真正的表单数据。 - cjstehno
1个回答

1
感谢@cjstehno
当他说"form-data"实际上是多部分数据时,我尝试将其作为多部分数据读取,但考虑到使用isFormField()方法来区分文件和参数。因此,从原始的servlet中,可以通过以下代码读取form-data。从性能的角度来看,我相信这可能会得到改进。
try {
     ServletFileUpload upload = new ServletFileUpload();
     FileItemIterator iter = upload.getItemIterator(request);

     while (iter.hasNext()) {
          FileItemStream item = iter.next();
          String name = item.getFieldName();

          if (item.isFormField()) {
               String value = Streams.asString(item.openStream());
          }
     }          
 } catch (Exception ex) {}

由于某些原因,当我包装一个请求时,即使内容类型为“x-www-form-urlencoded”,我也无法获取参数。我不得不更改客户端代码,始终使用“form-data”作为内容类型发送表单数据。 - Monday Fatigue
更新:我使用了自定义的ServletInputStream实现,并忘记设置isFinished和isReady。 - Monday Fatigue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接