Php 如何将cURL响应编码为JSON对象?

Php 如何将cURL响应编码为JSON对象?,php,ajax,post,curl,Php,Ajax,Post,Curl,我正在尝试使用jqueryajax将发布到PHP控制器。然后,我希望我的控制器从API检索数据,并将数据返回到我的AJAX函数 以下是我的javascript: $(function() { $.ajax({ type: 'POST', url: '/mycontroller/myaction/', success: function(data) { console.log(data);

我正在尝试使用jqueryajax将发布到PHP控制器。然后,我希望我的控制器从API检索数据,并将数据返回到我的AJAX函数

以下是我的javascript:

$(function() {

    $.ajax({
        type: 'POST',
        url: '/mycontroller/myaction/',
        success: function(data) {       
            console.log(data);
        }
    });

});
以下是我在控制器中的操作:

public function myaction() {

    $ch = curl_init();

    $endPoint = 'https://endpointfortheapi.com';

    curl_setopt($ch, CURLOPT_URL, $endPoint); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-type: application/json; charset=utf-8'
    ));

    $response = curl_exec($ch);

    $response = json_encode($response);

    echo $response;

    curl_close($ch);
}
但是,当我使用
json\u encode()
时,数组将作为转义字符串返回,而不是作为json对象返回。当我在AJAX请求中
console.log(data)
时,我看到如下字符串:

"[{\"firstProperty\":\"firstValue\",\"secondProperty\":\"secondValue\"}]"
public function myaction() {

    $ch = curl_init();

    $endPoint = 'https://endpointfortheapi.com';

    curl_setopt($ch, CURLOPT_URL, $endPoint); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    $response = curl_exec($ch);
    // $response = json_encode($response);

    // header('X-JSON: (' . $response. ')');
    header('Content-type: application/json');
    echo $response;

    curl_close($ch);

}

如何将响应数组编码为实际的JSON对象?

因此您要执行以下操作:

$response = curl_exec($ch);    
$response = json_encode($response);
不清楚返回的数据来自什么
https://endpointfortheapi.com
,但在我看来,您正在获取一个源JSON响应&然后在再次执行
JSON\u编码时对响应进行双重编码

如果您向
json\u encode
发送一个普通字符串,而不是一个对象或数组,它将完全按照您看到的那样对其进行转义。所以我会删除或注释掉这一行&看看这是否会澄清问题

此外,在回显之前,您应该在PHP中设置正确的JSON头。因此,基于我上面提到的&我将重构您的PHP代码,使其如下所示:

"[{\"firstProperty\":\"firstValue\",\"secondProperty\":\"secondValue\"}]"
public function myaction() {

    $ch = curl_init();

    $endPoint = 'https://endpointfortheapi.com';

    curl_setopt($ch, CURLOPT_URL, $endPoint); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    $response = curl_exec($ch);
    // $response = json_encode($response);

    // header('X-JSON: (' . $response. ')');
    header('Content-type: application/json');
    echo $response;

    curl_close($ch);

}

我注释掉了
X-JSON
头,因为一些应用程序使用它来自动评估JSON数据(如果它们正在使用)。如果您不使用Prototype并且不关心这些事情,那么就不值得这么麻烦。

在ajax请求中将
数据类型设置为
json

$(function() {

$.ajax({
    type: 'POST',
    url: '/mycontroller/myaction/',
    dataType: 'json',
    success: function(data) {       
        console.log(data);
    }
});

});

你正在运行什么版本的php?@Aleatoric好吧,
json\u encode
将只获取原始json并再次编码。由于它将原始JSON视为一个字符串,因此它将对其进行转义;这样重复两次内容的好处是什么?是否存在创建中断HTTP响应的风险?此外,JSON的正确内容类型是
application/JSON
,不,
x-
@IMSoP我已经退出了大约5年多的JavaScript开发,因此似乎不再鼓励使用
x-JSON
。我的
应用程序/x-json
也是如此。注释掉了
X-JSON
,修改了我的答案以解决这个问题,并设置了
application/JSON
。但这里的核心问题是在原始海报的代码中双重封装响应JSON;摆脱它,一切都好。@JakeGould谢谢你的帮助。我相信从我使用的API返回的数据是一个数组。我的印象是
json\u decode()
将数组转换为json对象。我正在使用
CURLOPT\u HTTPHEADER
设置标题。“我只是没有把它包括在我的问题里。”杰克·古尔德说,“是的。你是对的。响应不是实际的数组。我的错误。它是作为字符串返回的数组。删除
json\u encode()
修复了我的问题。在Ajax请求中,我还需要
dataType:json
。出于好奇,使用
header()
设置标题与使用
CURLOPT_HTTPHEADER
设置标题有什么区别,就像我在上面的问题一样。另外,
header()
不需要在
curl\u exec
之前出现吗?这里的问题肯定是PHP方面的问题,而不是JavaScript AJAX调用。因此,将
dataType
设置为
json
不会带来伤害,但不会解决问题。设置
dataType
会将json字符串转换为json对象。即使OP的代码中还有其他错误,他也很可能需要这个。@oOle2@JakeGould向我的Ajax请求中添加
dataType
,并删除
json\u encode()
修复了我的问题。谢谢大家!