如何将HttpClient POST请求代码等价改写为HttpURLConnection实现
HttpURLConnection 等价实现
以下代码和提供的Apache HttpClient版本逻辑完全对齐,包含表单提交、状态校验、异常重试、日志记录全量功能:
import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; public void sendBills(String idClient, String email, String bills, int retries, boolean original, boolean pdf, boolean excel, boolean withPhotoPDF, boolean withPhotoExcel, boolean imgs) { HttpURLConnection conn = null; try { // 构建请求地址 URL requestUrl = new URL(URL + "sendBill"); conn = (HttpURLConnection) requestUrl.openConnection(); conn.setRequestMethod("POST"); // 配置表单提交格式,对齐原UrlEncodedFormEntity的编码规则 conn.setDoOutput(true); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); conn.setConnectTimeout(15000); conn.setReadTimeout(15000); // 拼接请求参数,和原参数列表完全一致 StringBuilder paramBuilder = new StringBuilder(); paramBuilder.append(URLEncoder.encode("idClient", "UTF-8")).append("=").append(URLEncoder.encode(idClient, "UTF-8")).append("&"); paramBuilder.append(URLEncoder.encode("email", "UTF-8")).append("=").append(URLEncoder.encode(email, "UTF-8")).append("&"); paramBuilder.append(URLEncoder.encode("bills", "UTF-8")).append("=").append(URLEncoder.encode(bills, "UTF-8")).append("&"); paramBuilder.append(URLEncoder.encode("original", "UTF-8")).append("=").append(URLEncoder.encode(String.valueOf(original), "UTF-8")).append("&"); paramBuilder.append(URLEncoder.encode("pdf", "UTF-8")).append("=").append(URLEncoder.encode(String.valueOf(pdf), "UTF-8")).append("&"); paramBuilder.append(URLEncoder.encode("excel", "UTF-8")).append("=").append(URLEncoder.encode(String.valueOf(excel), "UTF-8")).append("&"); paramBuilder.append(URLEncoder.encode("withPhotoPDF", "UTF-8")).append("=").append(URLEncoder.encode(String.valueOf(withPhotoPDF), "UTF-8")).append("&"); paramBuilder.append(URLEncoder.encode("withPhotoExcel", "UTF-8")).append("=").append(URLEncoder.encode(String.valueOf(withPhotoExcel), "UTF-8")).append("&"); paramBuilder.append(URLEncoder.encode("imgs", "UTF-8")).append("=").append(URLEncoder.encode(String.valueOf(imgs), "UTF-8")); // 写入参数到请求体 try (OutputStream os = conn.getOutputStream()) { os.write(paramBuilder.toString().getBytes(StandardCharsets.UTF_8)); os.flush(); } // 处理响应,和原状态判断逻辑完全一致 int statusCode = conn.getResponseCode(); if (statusCode == 200) { StringBuilder resultBuilder = new StringBuilder(); try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { String line; while ((line = reader.readLine()) != null) { resultBuilder.append(line); } } String result = resultBuilder.toString(); if (!"1".equals(result)) { error = "1- Connection error: please, try again."; } } else { error = "Server error: please, try again later."; } } catch (IOException e) { e.printStackTrace(); Globals g = Globals.getInstance(); StringWriter errors = new StringWriter(); e.printStackTrace(new PrintWriter(errors)); g.putLog(errors.toString()); // 重试逻辑对齐原代码,修复了原代码递归时误传不存在的img变量的笔误 if (retries < 3) { retries++; sendBills(idClient, email, bills, retries, original, pdf, excel, withPhotoPDF, withPhotoExcel, imgs); } else { error = "There was a server error, please try again later."; } } finally { if (conn != null) { conn.disconnect(); } } }
注意点
- 所有参数均做URL编码,避免特殊字符导致的参数解析错误,编码格式和原HttpClient实现一致
- 保留了原代码所有错误提示文案、重试规则、日志写入逻辑
- 新增了连接释放逻辑,避免网络资源泄漏
- 修复了原代码递归调用时的参数笔误,原代码最后一个参数错写为
img(方法内无该变量),此处修正为正确的imgs参数
内容的提问来源于stack exchange,提问作者Daniel Bordera Climent
相关产品推荐
相关产品推荐

