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

Java中Curl命令传递含空格JSON值报错的解决求助

解决Java中调用curl传递含空格的JSON参数出错的问题

看起来你的问题出在curl对-d参数的默认处理上,导致含空格和引号的JSON payload没有被正确传递给服务器。从错误信息能看出,服务器收到的JSON被截断,而且字段名丢失了双引号,这说明curl在发送数据时对内容做了不该有的编码或解析。

直接修复curl命令的问题

最可靠的修复方式是用curl的--data-raw参数替代-d。-d会默认对数据进行URL编码,可能破坏JSON的结构;而--data-raw会原样发送你提供的字符串,确保空格、引号这些特殊字符都被正确传递。

我帮你改写了代码,同时把JSON payload单独提取成变量,让代码更清晰易维护:

public class CurlPostFix {
    public static void main(String[] args) {
        // 单独定义JSON payload,方便检查和修改
        String jsonPayload = "{\"FieldLabels\":\"Name,Status,Employee number\",\"FieldValues\":\"test7,Planned,Raj Kumar(123)\",\"Type\":\"BT\"}";
        
        String[] command = { 
            "curl", 
            "-X", "POST", 
            "http://my.url.com/add", 
            "-H", "accept: application/json", 
            "-H", "AuthorizationToken: 123", 
            "-H", "Content-Type: application/json", 
            "--data-raw",  // 关键:用--data-raw代替-d,避免编码破坏JSON
            jsonPayload 
        };

        ProcessBuilder process = new ProcessBuilder(command);
        try {
            Process p = process.start();
            
            // 读取正常输出
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            StringBuilder builder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                builder.append(line);
                builder.append(System.lineSeparator());
            }
            System.out.println("Curl output:\n" + builder);
            
            // 别忘了读取错误流,否则进程可能阻塞
            BufferedReader errorReader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            StringBuilder errorBuilder = new StringBuilder();
            while ((line = errorReader.readLine()) != null) {
                errorBuilder.append(line);
                errorBuilder.append(System.lineSeparator());
            }
            if (!errorBuilder.isEmpty()) {
                System.err.println("Curl errors:\n" + errorBuilder);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

额外建议:用Java原生HttpClient替代curl

调用外部curl命令总会有各种兼容性问题(比如不同系统的curl版本差异、参数解析问题),长远来看,直接用Java 11+自带的HttpClient发送请求会更可靠,代码也更简洁:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class NativeHttpPost {
    public static void main(String[] args) {
        String jsonPayload = "{\"FieldLabels\":\"Name,Status,Employee number\",\"FieldValues\":\"test7,Planned,Raj Kumar(123)\",\"Type\":\"BT\"}";
        
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("http://my.url.com/add"))
                .header("accept", "application/json")
                .header("AuthorizationToken", "123")
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(jsonPayload))
                .build();
        
        try {
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            System.out.println("Status code: " + response.statusCode());
            System.out.println("Response body:\n" + response.body());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这个方式不需要依赖外部工具,也不会出现参数解析的问题,推荐你尝试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:47:50