当前位置:首页 > 技术 > 正文内容

Java调用Python的x-www-form-urlencoded接口实现

访客 技术 2026年8月2日 1

本文介绍如何使用Java向Python后端服务发送x-www-form-urlencoded格式的POST请求,适用于Tornado等Python框架搭建的接口。

添加Maven依赖

首先在项目中添加Apache Commons HttpClient依赖:

<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>

核心实现代码

package com.example.util;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.NameValuePair;

/**
 * HTTP POST请求工具类
 */
public class HttpRequestUtil {

    /**
     * 发送POST请求并获取响应结果
     * @param requestUrl 请求地址
     * @param content 请求参数内容
     * @return 服务端返回的响应字符串
     */
    public String doRequest(String requestUrl, String content) {
        String response = "请求失败";
        try {
            response = executePost(requestUrl, content);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return decodeUnicode(response);
    }

    /**
     * 执行POST请求
     * @param requestUrl 请求URL地址
     * @param content POST请求体参数
     * @return 响应内容
     * @throws Exception 请求过程中的异常
     */
    private String executePost(String requestUrl, String content) throws Exception {
        PostMethod postRequest = new PostMethod(requestUrl);
        
        // 设置请求头Content-Type为x-www-form-urlencoded
        postRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
        
        // 构建请求参数数组,注意不能传NULL,需要传空字符串
        NameValuePair[] params = new NameValuePair[2];
        params[0] = new NameValuePair("type", "text");
        params[1] = new NameValuePair("content", content);
        
        postRequest.setRequestBody(params);
        
        HttpClient httpClient = new HttpClient();
        httpClient.executeMethod(postRequest);
        
        String result = postRequest.getResponseBodyAsString();
        postRequest.releaseConnection();
        
        return result;
    }

    /**
     * 解码Unicode字符串,将Unicode编码转换为中文
     * 处理Python接口返回的中文乱码问题
     * @param theString 包含Unicode编码的字符串
     * @return 解码后的正常字符串
     */
    public static String decodeUnicode(String theString) {
        char aChar;
        int len = theString.length();
        StringBuffer outBuffer = new StringBuffer(len);
        
        for (int x = 0; x < len;) {
            aChar = theString.charAt(x++);
            if (aChar == '\\') {
                aChar = theString.charAt(x++);
                if (aChar == 'u') {
                    // 读取四位十六进制数
                    int value = 0;
                    for (int i = 0; i < 4; i++) {
                        aChar = theString.charAt(x++);
                        switch (aChar) {
                            case '0': case '1': case '2': case '3': case '4':
                            case '5': case '6': case '7': case '8': case '9':
                                value = (value << 4) + aChar - '0';
                                break;
                            case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
                                value = (value << 4) + 10 + aChar - 'a';
                                break;
                            case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
                                value = (value << 4) + 10 + aChar - 'A';
                                break;
                            default:
                                throw new IllegalArgumentException("Malformed \\uxxxx encoding.");
                        }
                    }
                    outBuffer.append((char) value);
                } else {
                    if (aChar == 't') {
                        aChar = '\t';
                    } else if (aChar == 'r') {
                        aChar = '\r';
                    } else if (aChar == 'n') {
                        aChar = '\n';
                    } else if (aChar == 'f') {
                        aChar = '\f';
                    }
                    outBuffer.append(aChar);
                }
            } else {
                outBuffer.append(aChar);
            }
        }
        return outBuffer.toString();
    }
}

使用示例

public class Main {
    public static void main(String[] args) {
        HttpRequestUtil util = new HttpRequestUtil();
        String result = util.doRequest("http://your-python-server/api/endpoint", "测试内容");
        System.out.println("响应结果:" + result);
    }
}

关键点说明

  • Content-Type设置:必须设置为application/x-www-form-urlencoded,这是Python Tornado等框架默认支持的表单提交格式
  • 参数传递:NameValuePair数组不能传null,需要传空字符串
  • 连接释放:调用releaseConnection()释放HTTP连接资源
  • 字符编码:请求和响应都建议指定utf-8编码,避免中文乱码
  • Unicode解码:Python返回的中文字符可能是Unicode编码格式,需要解码处理

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。