Php 如何将cURL响应编码为JSON对象?
我正在尝试使用jqueryajax将发布到PHP控制器。然后,我希望我的控制器从API检索数据,并将数据返回到我的AJAX函数 以下是我的javascript: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);
$(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()
修复了我的问题。谢谢大家!