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

Java执行curl调用SOAP接口返回Unexpected character错误如何解决

问题原因

你遇到的报错核心是服务端收到的XML内容开头多了一个单引号',和XML规范要求的首字符为<不符,触发了解析异常,这个问题来自三个错误点:

  1. 代码拼写错误:XML变量定义时写的是xmlInut,后续使用的是xmlInput,会首先触发编译错误,需要先修正拼写。
  2. 多余的单引号:Linux shell里执行curl时,-d后面的单引号是shell用来标识参数边界的分隔符,不会作为内容传递给curl服务端;但你在Java代码里给XML内容手动加了外层单引号,这些单引号会被直接当成POST内容的一部分发出去,导致内容格式错误。
  3. Runtime.exec()参数解析问题:直接传入完整命令字符串时,Java不会像shell一样处理引号、转义字符、空格分隔逻辑,很容易出现参数拆分错误、特殊字符被转义的问题。

解决方法

方案1:修正curl调用代码(保留curl调用的场景)

修改逻辑如下:

  • 移除XML内容外层的多余单引号
  • 使用字符串数组形式传递命令参数,避免Java自动拆分参数出错
  • 补充读取进程错误流,避免进程阻塞,也方便后续排查问题

修正后的代码示例:

try {
    // 不要加外层单引号!直接写XML内容即可
    String xmlInput = "<soapenv:Envelope xmlns:soapenv=\"http://somenamespace/\">   <soapenv:Header/>   <soapenv:Body> DATA</soapenv:Body></soapenv:Envelope>";
    // 用数组形式构造命令,每个元素对应一个参数,不会被错误拆分
    String[] curlCommand = new String[]{
            "curl",
            "-X", "POST",
            "-H", "Content-Type: text/xml",
            "-H", "SOAPAction: \"GenerateToken\"",
            "-d", xmlInput,
            "https://somewebservice/"
    };
    Process process = Runtime.getRuntime().exec(curlCommand);
    // 同时读取输入流和错误流,避免进程因为缓冲区满阻塞
    BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
    BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    StringBuilder outputString = new StringBuilder();
    String line;
    while ((line = input.readLine()) != null) {
        outputString.append(line);
    }
    // 收集错误输出方便排查
    StringBuilder errorString = new StringBuilder();
    while ((line = error.readLine()) != null) {
        errorString.append(line);
    }
    int exitCode = process.waitFor();
    System.out.println("命令退出码:" + exitCode);
    System.out.println("响应内容:" + outputString);
    if (errorString.length() > 0) {
        System.out.println("错误输出:" + errorString);
    }
} catch (Exception e) {
    e.printStackTrace();
}

方案2:更推荐的原生HTTP客户端实现(避免调用curl)

Java场景下不建议通过跨进程调用curl发送HTTP请求,你可以直接使用原生HttpURLConnection或者第三方库(OkHttp、Apache HttpClient)发送SOAP请求,性能更稳定,也不会遇到参数解析类的问题。


内容的提问来源于stack exchange,提问作者matlab4dinner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:36:02