Php 我能';t从一个yii2高级应用程序接收json数据到另一个yii2高级应用程序,该应用程序包含文件\u get\u contents或curl

Php 我能';t从一个yii2高级应用程序接收json数据到另一个yii2高级应用程序,该应用程序包含文件\u get\u contents或curl,php,json,curl,yii2,yii2-advanced-app,Php,Json,Curl,Yii2,Yii2 Advanced App,我有一个yii2api应用程序,当我试图使用get_file_contents函数或curl从一个简单的php代码中获取一些数据时,它工作正常。但是,如果我想从另一个Yii2应用程序中使用相同的函数获得相同的结果,那么数据将在数据前面添加一个隐藏字符,如“\ufeff”{data}。当我使用Yii2应用程序时,这种情况一直都会发生。这就产生了一些使用数据的问题 示例: Yii2 API应用程序: Yii2应用程序: //Yii2 API应用程序控制器 公共职能行为() { 返回[ //响应格式

我有一个yii2api应用程序,当我试图使用get_file_contents函数或curl从一个简单的php代码中获取一些数据时,它工作正常。但是,如果我想从另一个Yii2应用程序中使用相同的函数获得相同的结果,那么数据将在数据前面添加一个隐藏字符,如“\ufeff”{data}。当我使用Yii2应用程序时,这种情况一直都会发生。这就产生了一些使用数据的问题

示例:
Yii2 API应用程序:
Yii2应用程序:

//Yii2 API应用程序控制器
公共职能行为()
{
返回[
//响应格式
[
'class'=>'yii\filters\contentcongregator',
“格式”=>[
'application/json'=>Response::FORMAT_json,
],
],
],
}
//提供用户名
公共函数actionUserData()
{
$model=UserData::findOne(['user\u id'=>1]);
返回[
“用户名”=>$model->username,
];
}
//Yii2应用程序控制器,从Yii2 API应用程序获取一些数据
公共函数actionGetSomeDataFromApi()
{
//Yii::$app->response->format=\Yii\web\response::format\u JSON;
$data=文件\u获取\u内容('http://example.com/api/v1/user-data');
echo$data;//返回{“用户名”:“名称”}
echo utf8_encode($data);//returnï»{“username”:“name”}
$jsonData=json_decode($data,true);
var_dump($jsonData);//将返回NULL
}
当我尝试用echo打印数据时,结果看起来不错,但是使用utf8_encode函数显示隐藏字符是什么导致了json_解码的问题

如果我将响应格式设置为application/json,将出现下一条错误消息:“SyntaxError:json.parse:json数据第1列第1行的意外字符”。因为ï»或\ufeff会自动添加到响应数据中

当数据通过curl或file\u get\u内容到达时,会显示chars


我可以在我的Yii2应用程序上处理这个问题,我可以删除这些字符,并正确显示数据,但这不是一个很好的解决方案。我想知道为什么会发生这种情况,以及如何解决这个问题。有什么想法吗?

返回gzip数据时,需要处理结果。这可以手动完成:

$data = file_get_contents('http://example.com/api/v1/user-data');
$decoded = gzinflate(substr($data,10));

$jsonData = json_decode($decoded, true);
结帐

或者自动使用curl

$url = 'http://example.com/api/v1/user-data';
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_ENCODING, 1);
$output = curl_exec($ch); 

curl_close($ch); 
$jsonData = json_decode($output, true);

我建议查看自动处理此问题的HTTP库,例如guzzle(),这为发出请求提供了一种干净的方式。

返回Gzip数据时,需要处理结果。这可以手动完成:

$data = file_get_contents('http://example.com/api/v1/user-data');
$decoded = gzinflate(substr($data,10));

$jsonData = json_decode($decoded, true);
结帐

或者自动使用curl

$url = 'http://example.com/api/v1/user-data';
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_ENCODING, 1);
$output = curl_exec($ch); 

curl_close($ch); 
$jsonData = json_decode($output, true);

我建议查看自动处理此问题的HTTP库,如guzzle(),它提供了一种干净的请求方式。

使用
trim($data)
可以解决您的问题吗?是的,我可以修剪数据,或者使用str_replace,preg_replace,它可以解决问题,但问题是为什么会发生这种情况?为什么通过文件内容返回带有奇怪字符的数据?只有当数据从一个Yii2应用程序到另一个Yii2应用程序时才使用curl。另一个api是否使用gzip之类的压缩形式?接受编码:gzip,deflate是否使用
trim($data)
修复您的问题?是的,我可以修剪数据或使用str\u replace,preg\u replace,它可以解决问题,但问题是为什么会这样?为什么要通过file_get_contents返回带有奇怪字符的数据,仅当数据从一个Yii2应用程序到另一个Yii2应用程序时才使用curl。其他api是否使用gzip之类的压缩形式?接受编码:gzip,deflateTanks对于您的答案,这是有用的,但不幸的是问题仍然存在,结果是一样的(您能将api中的整个响应(带有标题)添加到您的帖子中吗?@Davidsure,添加了api的响应。您能尝试从
actionUserData
返回一个空数组,如下
return[]
。还有问题吗?@DavidSure,但结果是一样的。谢谢你的回答,这很有用,但不幸的是,问题仍然存在,结果是一样的。:(你能从api中添加整个响应(带标题)吗在您的帖子中?@Davidsure,添加了api的响应。您是否可以尝试从
actionUserData
返回一个空数组,就像这样
return[]
。还有问题吗?@Davidsure,但结果是一样的。