【问题标题】:Getting JSON response WITH cURL使用 cURL 获取 JSON 响应
【发布时间】:2015-06-02 09:42:26
【问题描述】:

这太不可思议了,我不知道自己做错了什么,但我已经为此苦苦挣扎了几天。

这是我来自 de 命令行的 cURL 请求:

curl -i -H "Accept: text/html" http://laravel.project/api/v1/users/4

返回

HTTP/1.1 200 OK
Server: nginx/1.6.2
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: no-cache
Date: Sun, 29 Mar 2015 10:33:36 GMT
Set-Cookie: laravel_session=eyJpdiI6ImNPTkZIYVJZSVRKaHBOZTR3SWh0dHc9PSIsInZhbHVlIjoiblpZYVJlN2dBY1ljejNIYUQycXpsNXRWd1I5a3JSRG8wSWdDOWlHVTMrYUcrdDBNVmVuZUNkOGtJb2M4bXFpTFF3cUdoTFZOVXBWXC82Q1luSGd5bjJBPT0iLCJtYWMiOiI0ZTEwOWQxMmVhMzY2NjI1Yzc1MTBmZmRmYjUyOGQwNDlhYzRjOTNiM2FiOWIyN2E1YjA0OTM4YTUxZmNmMzMzIn0%3D; expires=Sun, 29-Mar-2015 12:33:36 GMT; Max-Age=7200; path=/; httponly

{
"data":{
  "id":4,
  "name":"Helena",
  "email":"hh@gmail.com",
  "created_at":"2015-03-26 21:13:16",
  "updated_at":"2015-03-26 21:13:16"
  }
}

所以一切看起来都很好,内容类型设置正确,响应是 JSON 格式。 但是现在看看如果我在 PHP 中使用 curl 使用 API 会发生什么。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $final_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
$result = curl_exec($ch);

return json_decode($result);

我收到此回复:

{#165
  +"data": {#167
    +"id": 4
    +"name": "Helena"
    +"email": "hh@gmail.com"
    +"created_at": "2015-03-26 21:13:16"
    +"updated_at": "2015-03-26 21:13:16"
  }
}

如果我在没有 json_decode 的情况下返回 $result,我会得到:

"{
  "data":{
    "id":4,
    "name":"Helena",
    "email":"hh@gmail.com",
    "created_at":"2015-03-26 21:13:16",
    "updated_at":"2015-03-26 21:13:16"
  }
}"

正确的响应但在引号内,我在 phpdocs 中读到 curl_opt_returntranfer 以字符串形式返回结果,但我不能成为地球上唯一想要获取 json 的人。

请帮忙

编辑 1

这是我的 ApiController 类

class ApiController extends Controller {

	// Base controller for API Controllers

    protected $statusCode = 200;

    protected function respond($data)
    {
        return Response::json([
           'data' => $data,

        ]);
    }

    protected function respondNotFound($message = 'No data found')
    {
        return Response::json([
            'error' => [
                'message' => $message,
                'status_code' => $this->getStatusCode(),
            ]
        ]);
    }
}

这是我的用户控制器

class UserController extends ApiController {

  public function show($user)
	{

       if ($user == null)
            return $this->setStatusCode(404)->respondNotFound('User not found');

        return $this->respond($user);
	}

}

【问题讨论】:

  • 请发布处理请求的函数(可能是在 UsersController 中显示操作)。谢谢。
  • 感谢关注,在编辑 1 中更新了更多信息
  • 我复制了你的代码并把它放到我的 Laravel 中,我没有双引号。是否在 Laravel 项目中使用 cUrl 并在 Web 浏览器上查看结果?
  • 我正在使用 POSTMAN 向使用 CURL 访问 API 应用程序的客户端控制器发送请求。
  • 您在 cURL 命令行调用和 PHP 示例之间使用了不同的接受标头。虽然我认为 PHP 示例是正确的,因为您正在寻找 JSON,但 API 是否没有正确响应 application/jsontext/html

标签: php json laravel curl


【解决方案1】:

我认为这会解决你的问题:

curl -i -H "Accept: text/html" http://laravel.project/api/v1/users/4 | tr -d '"'

【讨论】:

  • 实际上,当我在命令行中运行 cURL 命令时,一切正常。当我尝试在 PHP 中做同样的事情时,问题就来了
  • 尝试删除:curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));。 json_decode 转换字符串
  • 我仍然在“”之间得到我的json响应...... 4,"name":"Helena","email":"hh@gmail.com","created_at":"2015-03-26 21:13:16","updated_at":"2015-03-26 21 :13:16"}}"
  • @Borjante 使用修剪功能并删除双引号
  • 我不能......即使是 sub_str()
【解决方案2】:
$response = (string)$result;
                    $resp_arr = explode("<!DOCTYPE",$response);
                    $obj = json_decode(trim($japi_arr[0]));
                    if(isset($obj[0]))
                    {
                    $rsp_id = $obj[0]->id;
                    $rsp_name = $obj[0]->name;

【讨论】:

    【解决方案3】:

    如果我在没有 json_decode 的情况下返回 $result,我会得到:正确的响应,但在引号内

    不,是什么让你这么想?我想问题是你如何打印它,你很可能用 var_export($result)var_dump($result)echo json_encode($result); 添加引号来打印它。如果你只想要json,就用echo $result;回显它,不需要额外的处理,直接回显字符串,它已经是json了。

    【讨论】:

      猜你喜欢
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 2019-09-30
      • 2016-10-27
      • 2019-08-15
      • 1970-01-01
      • 2021-05-10
      相关资源
      最近更新 更多