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
相关产品推荐
相关产品推荐

