无法从HttpServlet请求获取数据



我看到过很多关于这个问题的旧帖子,但我一直在关注它们,但没有成功。

我创建了一个带有多个处理程序的jetty服务器,如下所示:https://github.com/eclipse/jetty.project/blob/jetty-9.4.x/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyConnectors.java.我有一个http处理程序和另一个https处理程序。处理程序扩展了AbstractHandler,并且只实现了handle((方法。

我可以使用Postman来发送请求和数据,但我有两个问题。

  1. 无论我使用POST、PUT还是GET,HttpServlet请求.getMethod((总是返回"获取">
  2. 我不知道如何通过POST发送数据。即使HttpServletRequest.getReader((不是null,我也没有得到任何数据。我在这里添加了一些登录功能,看看发生了什么。希望这对我有所帮助,因为它对我没有帮助
public class MyHandler extends AbstractHandler {

private static Logger logger = new L4Logger(MyHandler.class);
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
logger.info("MyHandler", "handle request " + request.getMethod() + " for path " + request.getContextPath());

logger.info("MyHandler", "content length " + request.getContentLength());

Enumeration<String> e = request.getParameterNames();
Collections.list(e).forEach(s -> {logger.info("MyHandler", "handle e " + s);});

Enumeration<String> a = request.getAttributeNames();
Collections.list(a).forEach(s -> {logger.info("MyHandler", "handle a " + s);});

if (request.getReader() == null) {
logger.info("MyHandler", "handle request request.getReader() == null");
} else {
logger.info("MyHandler", "handle request request.getReader() != null");
}

if (request.getContextPath().equalsIgnoreCase("/run")) {
logger.info("MyHandler", "handle request run");
String cmdString = getBody(request);
logger.info("MyHandler", "handle run data " + cmdString);
}

response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
}

private String getBody(HttpServletRequest request) throws IOException {
StringBuilder buffer = new StringBuilder();
BufferedReader reader = request.getReader();

String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
return buffer.toString();
}
}

在我的服务器上张贴一些json数据,日志输出如下:

[handle request GET for path /run]
[content length -1]
[handle a javax.servlet.request.key_size]
[handle a org.eclipse.jetty.servlet.request.ssl_session]
[handle a javax.servlet.request.X509Certificate]
[handle a javax.servlet.request.cipher_suite]
[handle a javax.servlet.request.ssl_session_id]
[handle request request.getReader() != null]
[handle request run]
[handle run data ]

最后,这里是从Postman导出的cURL命令:

curl --location --request POST 'https://localhost:7777/run' --header 'Content-Type: application/json' --header 'Cookie: ssoLang=en' --data-raw '[{"cmd":"ls","args":"/proc"}]'

-1的Content-Length是正在发生的事情的潜在标志。

Content-Type报头在很大程度上也控制了这里的行为。

转储/记录所有请求标头,查找Content-LengthTransfer-EncodingContent-Encoding等……几乎所有控制请求正文内容处置的相关标头。

示例:验证您的请求头实际上是Content-Type: application/json

您可以使用curl -vvvv在命令行上转储请求/响应标头。

你可以在服务器端用。。。

logger.info("MyHandler", "request content-type: " + request.getHeader("Content-Type"));

如果这不是您所期望的,那么很可能是标准Servlet行为。

当您使用以下任何方法时。。。

  • HttpServlet请求.getParameter(字符串名称(
  • HttpServlet请求.getParameterMap((
  • HttpServlet请求.getParameterNames((
  • HttpServlet请求.getParameterValues(字符串名称(
  • HttpServlet请求.getParts((
  • HttpServlet请求.getPart(字符串名称(

请求使用POST方法,并使用特殊的Content-Type值。。。

  • application/x-www-form-urlencoded
  • multipart/form-data(以及定义了javax.servlet.MultipartConfigElement的端点(

那么您也在阅读正文内容。

在这些方法调用之后,请求中没有剩余的数据可供读取。

最新更新