PHP发送含换行符的JSON格式cURL POST请求的问题求助
问题根因
你当前请求失败是两个错误共同导致的:
- 手动拼接JSON字符串的转义逻辑不符合要求:PHP双引号包裹的字符串中,
\n会被解析为实际的换行符,而JSON规范要求字符串内的换行必须转义为\n字符序列,不能出现原生换行 - 嵌套在
description_key内的双引号没有做双重转义,导致整个POST请求的JSON结构本身非法,接口无法正常解析
最优解决方案(推荐)
不要手动拼接JSON,使用PHP内置的json_encode函数自动处理所有转义逻辑,可100%避免转义错误:
<?php // 1. 先按原生结构构造请求参数数组 $postData = [ 'key1' => 'value1', 'key2' => 'value2', // 直接写你需要的description_key值即可,不需要额外转义 'description_key' => "{\n\"inner_text_key1\": \"inner_text_value\"\n}" ]; // 2. 由json_encode自动生成符合规范的JSON字符串,所有换行、引号都会被正确转义 $postFields = json_encode($postData); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://url.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); $headers = array(); $headers[] = 'Accept: application/json'; $headers[] = 'X-Api-Key: 替换为实际的API_KEY'; $headers[] = 'Content-Type: application/json'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } curl_close($ch); echo '<pre>'; var_dump($result); echo '</pre>';
手动拼接JSON的修正方案(不推荐)
如果一定要手动拼接,需要对转义字符做双重处理:\n转写为\\n,内部的双引号转写为\\",修正后的POST字段如下:
curl_setopt($ch, CURLOPT_POSTFIELDS, "{\"key1\": \"value1\", \"key2\": \"value2\", \"description_key\": \"{\\n\\\"inner_text_key1\\\": \\\"inner_text_value\\\"\\n}\"}");
你可以把最终生成的请求体字符串打印出来,和CLI下curl命令的-d参数内容对比,二者完全一致即可正常请求。
内容的提问来源于stack exchange,提问作者Bruce
相关产品推荐
相关产品推荐

