【发布时间】:2020-11-04 07:31:03
【问题描述】:
我看过很多关于这个问题的旧帖子,但我没有成功。
我创建了一个带有多个处理程序的码头服务器: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 访问两个处理程序(我可以通过日志记录看到)发送请求和数据,但我有 2 个问题。
- 无论我使用 POST、PUT 还是 GET,HttpServletRequest.getMethod() 总是返回“GET”。
- 我不知道如何通过 POST 获取数据。即使 HttpServletRequest.getReader() 不为空,我只是没有得到任何数据。 我在这里添加了一堆登录以查看发生了什么。希望这会有所帮助,因为它对我没有帮助。
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"}]'
【问题讨论】:
-
将详细输出添加到 curl 行
curl -vvvv ...,再次运行它,然后使用它产生的输出编辑您的问题。它可以揭示一些有用的东西。 (就像它没有通过 POST 请求正确地跟随重定向)。 -
经过多次反复试验和挫折后,我放弃了这种方法并使用此处描述的 RESTful 解决方案:stackoverflow.com/questions/38206312/…。这个解决方案足以满足我的需要,我在几个小时内就完成了工作,因此我放弃了最初的方法。
标签: java servlets jetty handler