URL 定位资源,URLConnection 负责通信;动态构建 URL 需编码参数并管理环境配置,配置 URLConnection 要区分 GET/POST、设置超时与请求头,POST 需 setDoOutput(true),写入请求体须编码并确保刷新或关闭流,读取响应需检查状态码、指定 UTF-8 编码。

URL 和 URLConnection 是 Java 基础网络编程中一对紧密配合的工具:URL 定位资源,URLConnection 负责与该资源通信。执行“变量网络请求”,核心在于动态构造 URL(如拼接参数、切换域名或路径),并灵活配置 URLConnection(如设置请求头、超时、POST 数据等)。下面从实战角度拆解关键环节。
动态构建带参 URL
变量请求往往体现在查询参数、路径段或主机名可变。例如根据用户 ID 获取不同数据:
- 用 String.format 或 StringBuilder 拼接简单参数:
String urlStr = String.format("https://api.example.com/user/%s?role=%s", userId, URLEncoder.encode(role, "UTF-8")); - 对复杂参数建议先封装为 Map,再手动编码拼接,避免遗漏 URLEncoder.encode;中文、空格、特殊符号必须编码,否则可能抛
MalformedURLException或服务端解析失败。 - 注意 URL 中的协议、主机、端口变化也属“变量”——比如测试环境切到
http://localhost:8080,生产切到https://api.prod.com,可通过配置文件或系统属性统一管理,而非硬编码。
配置 URLConnection 发送请求
获取连接后,需按需设置行为,尤其区分 GET 与 POST:
- 强制转为 HttpURLConnection 以便调用 HTTP 特有方法(如 setRequestMethod):
- GET 请求只需设置超时和请求头:
conn.setConnectTimeout(5000);<br>conn.setReadTimeout(10000);<br>conn.setRequestProperty("User-Agent", "MyApp/1.0"); - POST 请求必须调用 setDoOutput(true),否则 getOutputStream() 会抛异常;同时建议关闭缓存:
conn.setDoOutput(true);<br>conn.setUseCaches(false);
- 若要发送 JSON,需设置 Content-Type:
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
写入变量请求体(POST/PUT)
当请求体内容随业务变化(如不同表单字段、不同 JSON 结构),推荐封装为字符串或字节数组再写入:
- 表单提交(x-www-form-urlencoded):
String body = "name=" + URLEncoder.encode(name, "UTF-8") + "&age=" + age;
写入:try (DataOutputStream out = new DataOutputStream(conn.getOutputStream())) { out.writeBytes(body); } - JSON 提交(更常见):
先构造 JSONObject 或用 Jackson/Gson 序列化为字符串,再转为 UTF-8 字节数组写入:
byte[] jsonBytes = jsonStr.getBytes(StandardCharsets.UTF_8);<br>conn.getOutputStream().write(jsonBytes);
- 务必在写入后调用 flush()(DataOutputStream)或确保流关闭,否则服务器可能收不到完整数据。
读取并处理响应结果
响应状态码和内容类型决定后续逻辑,不能忽略错误分支:
- 先检查 getResponseCode(),2xx 表示成功,4xx/5xx 需按需处理(如重试、提示、记录日志);
- 通过 getContentType() 判断返回是否为 JSON 或 HTML,再选择解析方式;
- 读取响应流时使用 InputStreamReader 指定 UTF-8 编码,防止中文乱码;
- 推荐用 try-with-resources 自动关闭流:
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"))) { ... }

















