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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:21:24