You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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端口的请求,打印请求路径后转发到目标应用:

  1. 让客户端将请求发送到中间件端口(示例用3333)
  2. 中间件接收请求后,打印请求端点
  3. 将请求转发到localhost:3332
  4. 接收目标应用的响应并返回给客户端

核心代码示例:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:39:34