我有通过cURL调用脚本的脚本。它看起来像这样,
Route::get('login-redirect', function() {
if (Input::has('error')) {
return Input::get('error_description');
}
if (Input::has('code')) {
$fields = array(
'grant_type' => 'password',
'username' => 'admin@local.com',
'password' => 'passwohrd',
'client_id' => 'testclient'
);
$fieldstring = http_build_query($fields, "\n");
$url = "http://apitest.local/api/v1/get-token";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fieldstring);
$result = curl_exec($ch);
$json = json_decode($result);
curl_close($ch);
$fields = array('access_token' => '3c1e6b099f172fc01304403939edf8e56904ab61');
$fieldstring = http_build_query($fields, "\n");
$url = "http://apitest.local/api/v1/me";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fieldstring);
$result = curl_exec($ch);
curl_close($ch);
dd($result);
}
如果我dd($json)
{"content":null,"error":true,"error_description":"Invalid username and password combination"}int(1)
我觉得在通过json_decode
运行之后我应该能够输出$json->error
但是没有。
JSON是在下面的类中创建的,但我在这里看不到任何奇怪的东西,我做错了,还是我误解了json_decode? p>
<?php
namespace Shaunpersad\ApiFoundation\Http;
use App;
use Response;
class ErrorResponse
{
public static function make($message = '', $status = 200, array $headers = array(), $options = 0)
{
$response = App::make(
'api_response_array',
array(
'content' => null,
'error' => true,
'error_description' => $message
)
);
return Response::json($response, $status, $headers, $options);
}
}
答案 0 :(得分:1)
首先,你没有CURLOPT_RETURNTRANSFER - 你的curl_exec直接将输出缓冲区返回到屏幕。
其次,看起来你在某处有var_dump而且我看不到哪里:)
第三,你没有问过任何直接的问题。
修改强>
好的,我已经读过几次,并在下面回答。 dd()函数确实是一个var_dump包装器,但它将var_dump数据转储为json格式的afaics。
答案 1 :(得分:0)
<强>更新强>
如其他答案所述,由于您尚未设置CURLOPT_RETURNTRANSFER
,因此您实际上并未收到输出。因此,当curl_exec()
请求成功运行时,1
将回显对DOM的响应并返回true( curl
)。
您可以通过在某处的curl请求中设置此项来运行以下内容:
curl_setop(CURLOPT_RETURNTRANSFER, true);
dd()
是laravel function
,这就是文档所说的内容:
转储给定变量并结束脚本执行。
我认为它只是一个更美观的包装函数var_dump()
( 因为我不使用laravel,我不知道它的确切输出 )。
您想要的是解码从$result
返回的cUrl
。这样的事情就足够了:
$data = json_decode($result);
echo $data->error_description;
成功解码的对象如下所示:
stdClass Object
(
[content] =>
[error] => 1
[error_description] => Invalid username and password combination
)
您甚至可以现在测试您的布尔error
值:
if($data->error) {
//....true
} else {
//....false
}
答案 2 :(得分:0)
您输出的内容不是来自dd($json)
:
// this part has been output by curl_exec():
{"content":null,"error":true,"error_description":"Invalid username and password combination"}
// only this part comes from dd($json):
int(1)
原因如下:
// no CURLOPT_RETURNTRANSFER, so curl_exec() outputs result and returns true:
$result = curl_exec($ch);
// thus $result = true;
// so here $json = 1, since this is what json_decode(true) will return
$json = json_decode($result);
// then you did dd($json), so it just appended var_dump(1) to the output:
{"content":null,"error":true,"error_description":"Invalid username and password combination"}int(1)