求Java实现监听localhost:3332并打印请求端点的中间件方案
问题分析与解决方案
你的Python脚本核心问题
- 语法错误:
with requests.Session() as session:块内的代码未缩进,response = requests.get(url)必须缩进才能归入session上下文 - 逻辑偏差:当前脚本只是主动循环请求根路径,完全没有实现监听端口上其他请求的功能,自然无法捕获目标应用被调用的端点
修正后的Python脚本(仅修复语法,仍不满足监听需求)
import requests url = 'http://127.0.0.1:3332/' while True: with requests.Session() as session: response = requests.get(url) if response.status_code == 200: print("Successful connection with API.") # 仅能打印当前主动请求的路径,无法捕获所有被调用的端点 print(f"当前请求端点: {response.url}")
实现监听请求端点的正确思路
要捕获localhost:3332上目标应用的所有请求端点,你需要做反向代理/端口拦截,而非主动发起请求。
方案1:Java中间件实现(符合你的开发计划)
用Java实现一个简单的HTTP代理服务器,拦截所有发往3332端口的请求,打印请求路径后转发到目标应用:
- 让客户端将请求发送到中间件端口(示例用3333)
- 中间件接收请求后,打印请求端点
- 将请求转发到
localhost:3332 - 接收目标应用的响应并返回给客户端
核心代码示例:
import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.URL; public class RequestListenerMiddleware { public static void main(String[] args) throws IOException { // 中间件监听3333端口 HttpServer server = HttpServer.create(new InetSocketAddress(3333), 0); server.createContext("/", new ProxyHandler()); server.start(); System.out.println("Java中间件已启动,监听端口3333"); } static class ProxyHandler implements HttpHandler { @Override public void handle(HttpExchange exchange) throws IOException { // 打印请求端点 String endpoint = exchange.getRequestURI().toString(); System.out.println("捕获请求端点: " + endpoint); // 转发请求到目标应用3332端口 URL targetUrl = new URL("http://127.0.0.1:3332" + endpoint); HttpURLConnection conn = (HttpURLConnection) targetUrl.openConnection(); conn.setRequestMethod(exchange.getRequestMethod()); // 复制请求头 exchange.getRequestHeaders().forEach((key, values) -> { values.forEach(value -> conn.addRequestProperty(key, value)); }); // 复制请求体 if (exchange.getRequestMethod().equalsIgnoreCase("POST") || exchange.getRequestMethod().equalsIgnoreCase("PUT")) { conn.setDoOutput(true); try (InputStream in = exchange.getRequestBody(); OutputStream out = conn.getOutputStream()) { in.transferTo(out); } } // 发送响应给客户端 exchange.sendResponseHeaders(conn.getResponseCode(), conn.getContentLengthLong()); try (InputStream in = conn.getInputStream(); OutputStream out = exchange.getResponseBody()) { in.transferTo(out); } exchange.close(); } } }
使用步骤:
- 启动目标应用(监听3332)
- 启动该Java中间件(监听3333)
- 客户端将请求发送到
localhost:3333,中间件会自动打印所有请求端点
方案2:Python临时代理(快速验证)
用http.server实现简易代理,快速验证监听效果:
from http.server import BaseHTTPRequestHandler, HTTPServer import requests class ProxyHandler(BaseHTTPRequestHandler): def do_GET(self): # 打印GET请求端点 print(f"捕获GET请求端点: {self.path}") # 转发请求到目标应用 response = requests.get(f"http://127.0.0.1:3332{self.path}") self.send_response(response.status_code) for key, value in response.headers.items(): self.send_header(key, value) self.end_headers() self.wfile.write(response.content) def do_POST(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length) # 打印POST请求端点 print(f"捕获POST请求端点: {self.path}") # 转发请求到目标应用 response = requests.post(f"http://127.0.0.1:3332{self.path}", data=post_data, headers=dict(self.headers)) self.send_response(response.status_code) for key, value in response.headers.items(): self.send_header(key, value) self.end_headers() self.wfile.write(response.content) if __name__ == '__main__': server = HTTPServer(('localhost', 3333), ProxyHandler) print("Python代理已启动,监听端口3333") server.serve_forever()
使用方式同Java方案:客户端请求3333端口,代理自动转发到3332并打印端点
内容的提问来源于stack exchange,提问作者Denisa Buzan
相关产品推荐
相关产品推荐

