在 Java 里“解析 HTTP”通常有几种常见场景,不同场景用的方式不一样。下面按最常见的用法给你系统讲一下,并配上示例。
如果你是写服务器,需要解析客户端发来的 HTTP 请求(如 Spring Boot、Servlet)。
@WebServlet("/test")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
// 请求行
String method = req.getMethod(); // GET
String uri = req.getRequestURI(); // /test
String query = req.getQueryString(); // a=1&b=2
// 请求头
String userAgent = req.getHeader("User-Agent");
// 请求参数
String a = req.getParameter("a");
// 响应
resp.getWriter().write("ok");
}
}
✅ 适合:传统 Java Web、Tomcat
✅ 自动帮你解析 HTTP 请求行、Header、参数
@RestController
public class TestController {
@GetMapping("/test")
public String test(
@RequestParam String a,
HttpServletRequest request) {
String ua = request.getHeader("User-Agent");
return "ok";
}
}
Spring 已经帮你把 HTTP 解析成对象了。
如果你是调用别人接口,需要解析 HTTP 响应。
HttpClient(推荐 ✅)import java.net.http.*;
import java.net.URI;
public class HttpDemo {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.baidu.com"))
.GET()
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
// 状态行
int statusCode = response.statusCode();
// 响应头
HttpHeaders headers = response.headers();
headers.firstValue("Content-Type").ifPresent(System.out::println);
// 响应体
String body = response.body();
System.out.println(body);
}
}
✅ 现代、简洁、官方推荐
✅ 自动解析 HTTP 响应结构
CloseableHttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet("https://www.baidu.com");
try (CloseableHttpResponse response = client.execute(get)) {
System.out.println(response.getStatusLine());
System.out.println(EntityUtils.toString(response.getEntity()));
}
如果你拿到了原始 HTTP 文本(如 Socket 编程):
GET /test?a=1 HTTP/1.1
Host: localhost
User-Agent: curl/7.0
你可以手动解析:
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
// 请求行
String requestLine = reader.readLine(); // GET /test?a=1 HTTP/1.1
String[] parts = requestLine.split(" ");
String method = parts[0];
String path = parts[1];
String protocol = parts[2];
// 请求头
String line;
while (!(line = reader.readLine()).isEmpty()) {
String[] header = line.split(": ", 2);
System.out.println(header[0] + " -> " + header[1]);
}
⚠️ 一般不推荐,除非你在写 HTTP 服务器或学习协议
ObjectMapper mapper = new ObjectMapper();
Map map = mapper.readValue(jsonString, Map.class);
String query = "?a=1&b=2";
String[] pairs = query.split("&");
| 场景 | 推荐方式 |
|---|---|
| 写接口 | Spring Boot / Servlet |
| 调接口 | java.net.http.HttpClient |
| 底层学习 | Socket + 手动解析 |
| 老项目 | Apache HttpClient |
如果你能说清楚:
我可以直接给你最合适、最精简的示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。