1

很多同学在 LeanCloud 上遇到的不少问题,其实可以自我解决的,现在介绍一下 LeanCloud 上的调试方法。

LeanCloud 是通过 REST API 来进行前后端分离的,这意味着当出现问题的时候,首先应该看看网络请求是什么,来确定是客户端发出的请求不对,还是服务端处理请求不对。LeanCloud 上有专门的 REST API 文档

概要

    通过调用允许打印日志的函数,来打印更多的日志,包括网络请求日志,根据具体的 REST API 请求和返回结果,从而快速定位问题。若对某个接口函数有疑惑,可快速翻阅 API文档

    初始化时调用以下函数来开启日志。注意发布应用时关闭日志,避免泄露数据。

Android SDK 2.6.7+:

AVOSCloud.setDebugLogEnabled(true);

iOS SDK :

setenv("LOG_CURL", "YES", 0);  

Android SDK 调试方法

先介绍 Android SDK 的调试方法,

开启调试日志

首先在 Application 的 onCreate 中,开启调试日志,

20141217152413968

然后,针对于下面的请求,fetch 一个 _User 对象,同时获取 friends 字段里的对象,

然后那里断点一下,可以看到,刚刚的请求和应答是这样的,[点击查看大图]

20141217154420624

curl -X GET \
     -H "X-avoscloud-Application-Id: APP_ID"\
     -H "X-avoscloud-Application-Key: YourAppKey"\
     -G --data-urlencode 'include=friends' \
     https://api.leancloud.cn/1.1/users/53f0d534e4b0c1ae470ca958

以及返回的 json 字符串,

{  
    "gender": 1,   
    "friends": {  
        "__type": "Relation",   
        "className": "_User"  
    },   
    "location": {  
        "longitude": 116.316858,   
        "latitude": 39.985525,   
        "__type": "GeoPoint"  
    },   
    "sex": true,   
    "avatar": {  
        "key": "4IC5arNWrQo6lC4jOCamCm8Zhh0aVLINVPpO6T0p",   
        "name": "小z",   
        "mime_type": "application/octet-stream",   
        "bucket": "x3o016bx",   
        "url": "http://ac-x3o016bx.qiniudn.com/4IC5arNWrQo6lC4jOCamCm8Zhh0aVLINVPpO6T0p",   
        "createdAt": "2014-12-12T11:10:41.739Z",   
        "objectId": "548acd31e4b03d0b8f8d4d83",   
        "updatedAt": "2014-12-12T11:10:41.739Z",   
        "metaData": {  
            "_checksum": "251933a19cd401bae53aafd5cb445a5c",   
            "_name": "小z",   
            "owner": "53f0d534e4b0c1ae470ca958",   
            "size": 45257  
        },   
        "__type": "File"  
    },   
    "username": "小z",   
    "mobilePhoneVerified": false,   
    "createdAt": "2014-08-17T16:15:48.069Z",   
    "objectId": "53f0d534e4b0c1ae470ca958",   
    "importFromParse": false,   
    "emailVerified": false,   
    "updatedAt": "2014-12-17T06:56:56.842Z"  
}  

日志过滤

可以专门对此类日志进行过滤一下,以便快速获取信息,

20141217163228143

Tag是:

===AVOS Cloud===

那么可以在 刚刚那个 REST API文档,看看这个请求是什么意思,文档上面说,

20141217152859302

对那个 REST API 文档,搜索一下 include 即可以找到。

那么有了 curl 请求和请求结果,就可以判断很多事情了,有没有返回自己想要的值、返回了哪些字段等。对于 Pointer 类型的字段,返回的是 Pointer 类型,还是 Object 类型,Pointer 类型的话,只有 objectId,Object 类型还有相应的字段。

API 在线测试工具

LeanCloud 还有特别好用的 API在线测试工具,比如针对上面的请求,我们迅速找到相应的 API,

20141217154032531

然后,
20141217153809625

只要把写入 class 和 objectdId 既可以获得格式化的 json 字符串。

就可以看看原来的 fetch 代码发生了什么。

iOS SDK 调试方法

iOS SDK 上也是一样的,

应用启动后调用以下函数,
20141217155000968

针对于这样一个查找用户的函数,查找用户名包含有子串 partName 的所有用户,

20141217155237392

在结束的时候打上断点,那么可以看到日志输出,

20141217155445265

这个请求经过 urlencode 了,找个工具 decode 一下,http://tool.chinaz.com/Tools/URLEncode.aspx,可以看到的是,

curl -i -k -X GET --compressed   
      -H 'x-avoscloud-request-sign: 517d516e7c09a72822e116e64d11e2ce,1418816439658'   
      -H 'X-avoscloud-Application-Production: 1'   
      -H 'X-avoscloud-Application-Id: x3o016bxnkpyee7e9pa5pre6efx2dadyerdlcez0wbzhw25g'  
      -H 'User-Agent: AVOS Cloud iOS-v2.6.8 SDK'  
      -H 'X-avoscloud-Session-Token: axchejue4dmu04h5radozyvnc'   
      -H 'Accept: application/json'   
      "https://api.leancloud.cn/1.1/users?order=-updatedAt&where={"username":{"$regex":".*lzw.*"},"objectId":{"$ne":"54913d21e4b0c4eaaccc3a3e"}}" 

可以看到查找用户,正则匹配.lzw.,同时 objectId 不是自己的,来找到其它人,并且根据更新时间的逆序排序。

那么就清晰了,能更多弄清楚后面是怎么工作的。

更多例子

我们再来几个例子,

调试 login

login 的时候发出的请求,

20141217162227359

curl -i -k -X POST --compressed  \  
     -d '{"username":"lzw12","password":"lzw12"}'  \   
     -H 'x-avoscloud-request-sign: 3bd58a85549a3879442028630278ec43,1418814108622'  \  
     -H 'X-avoscloud-Application-Production: 1'   \  
     -H 'X-avoscloud-Application-Id: x3o016bxnkpyee7e9pa5pre6efx2dadyerdlcez0wbzhw25g'  \  
     -H 'User-Agent: AVOS Cloud iOS-v2.6.8 SDK' \  
     -H 'Content-Type: application/json; charset=utf-8' \  
     -H 'Accept: application/json'  \  
     "https://api.leancloud.cn/1.1/login" 

可以看到,传入了 username 和 password。

调试 save

创建一条记录,

20141217163501179

日志是:

curl -X POST   
     -H "X-avoscloud-Application-Id: APP_ID"  
     -H "X-avoscloud-Application-Key: YourAppKey"   
     -H "Content-Type: application/json"   
     -d '{"requests":[{"body":{"__children":[],"__internalId":"c9d38635-8336-4448-bb84-d99d89d15b4a","content":"这是一条Todo"},"method":"POST","path":"/1.1/classes/Todo"}]}'   
     https://api.leancloud.cn/1.1/batch/save  

可以看到发出了/batch/save 的请求,批量保存。

调试 push

再来看推送的时候的请求,代码是这样的,

20141217164336869

setQuery 那句是说,根据 installationId 来找到自己,然后进行推送。

curl   -X POST   
       -H "X-avoscloud-Application-Id: APP_ID"   
       -H "X-avoscloud-Application-Key: YourAppKey"   
       -H "Content-Type: application/json"   
       -d '{"channels":["public"],"data":{"alert":"hello world from avoscloud."},"where":{"installationId":"4f55cffe-19d3-4d2f-b309-ddadd4f07b4e"}}'   
       https://api.leancloud.cn/1.1/push  

网络请求都可以这般输出日志,可以根据输出的日志来判断是哪一步出了错。


LeanCloud
5k 声望8.4k 粉丝

LeanCloud 提供包括数据存储、文件存储、消息推送、即时通讯、可自动扩容的云引擎容器和大数据分析工具在内的后端服务,全面涵盖互联网产品开发的需求。