在大多数情况下,cURL 返回半个 json 字符串


cURL returns half json string in most cases

First edit (more details)

  • 我在 Firefox 中使用了修改标头插件并访问了页面 (http://api.wunderlist.com/me/tasks),这显示了我需要的完整且正确的 json 字符串。它永远不会失败(25+ 测试)
  • 我尝试使用file_get_contents,但也file_get_contents减少了响应。在不同的点。
  • cURL 也这样做,在各个点减少响应 json。看起来"随机"

Original post

我在这里为一个奇怪的问题打破了我的头。我已经为Wunderlist2(http://www.wunderlist.com)创建了一个PHP包装器,可以在这里找到:https://github.com/PENDOnl/Wunderlist2-PHP-Wrapper

它运行良好,直到用户通知我该类突然停止工作。由于我创建了一个免费服务(http://wcal.me)来为Wunderlist用户提供日历提要,因此我决定查看该脚本,因为这是我调试脚本的最简单方法。

登录到Wunderlist并获取authtoken工作,类中的所有其他函数似乎都可以找到(获取"我","我/列表"等)但是,在getTasks函数("me/tasks")的情况下,我得到的响应不完整,它只是在json字符串的中间停止。因此,json_decode函数返回 NULL,因此在日历进给/方法响应中将没有可用的任务。

我还注意到它是非常随机的,因为在某些情况下(<10%)它像应该的那样工作,但是在再次刷新后,输出再次减半。此外,每次刷新时"剪切"的确切位置都不同。

有没有人可以确定问题所在?我试图看看是否有办法等到文件完全下载后再返回,但如果这不是 cURL 的默认行为,那就太奇怪了。我还尝试增加超时时间,但由于它返回一个值,我想它也不会超时。

所有代码都可以在 Github 存储库中找到,到目前为止,这是我更改为调试的唯一部分:

        // get / put / delete requests should have HTTP Code 200 OK
        // only exception is the login method, which returns HTTP Code 200 OK
        if($httpCode == 200 && (strtolower($method) != 'post' || $action == '/login'))
        {
            $return = json_decode($output, true);
            if($_SERVER['REMOTE_ADDR'] == MY_IP) {
                if( is_null($return) ) {
                    echo "<b>Output of json_decode is null:</b><br><br>";
                    echo $output;   
                } else {
                    echo "<b>Output of json_decode os not null:</b><br><br>";
                    echo $output;   
                }
            }
            return $return;
        }

完整的响应应如下所示:

[{"assignee_id":null,"completed_at":null,"completed_by_id":null,"created_at":"2013-11-10T13:16:54Z"},{"assignee_id":null,"completed_at":null,"completed_by_id":null,"created_at":"2013-11-10T13:16:54Z"}]

但在大多数情况下,它是:

[{"assignee_id":null,"completed_at":null,"completed_by_id":null,"created_at":"2013-11-10T13:16:54Z"},{"assignee

当然,这是一个缩小的响应,响应中有更多的信息可用,数组中还有更多的项目。

出于测试目的,如果使用类进行身份验证,浏览到 http://api.wunderlist.com/me/tasks 会产生什么结果?

另外,我相信您已经修复了,但在base.class.php中,$action正在两次检查空值,而不是$action和$method。

问题出在Wunderlist上,只是在等待他们的修复:)