非常多同学在LeanCloud上遇到的不少问题,事实上能够自我解决的,如今介绍一下LeanCloud上的调试方法。

LeanCloud 是通过 REST API来进行前后端分离的。这意味着当出现故障的时候,首先应该看看网络请求是什么,来确定是client发出的请求不正确,还是服务端处理请求不正确。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中。开启调试日志,

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

然后那里断点一下,能够看到。刚刚的请求和应答是这种,点击查看大图

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"
}

日志过滤

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

Tag是:

===AVOS Cloud===

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

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

那么有了curl请求和请求结果,就能够推断非常多事情了,有没有返回自己想要的值、返回了哪些字段等。对于Pointer类型的字段,返回的是Pointer类型。还是Object类型,Pointer类型的话。仅仅有objectId。Object类型还有对应的字段。

API在线測试工具

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

然后,

仅仅要把写入class和objectdId 既能够获得格式化的json字符串。

就能够看看原来的fetch代码发生了什么。

iOS SDK 调试方法

iOS SDK上也是一样的。

应用启动后调用下面函数,

针对于这样一个查找用户的函数。查找username包括有子串partName的全部用户,

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

这个请求经过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的时候发出的请求,

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

创建一条记录,

日志是:

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

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

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 SDK 中秒杀70%问题的调试方法的更多相关文章

  1. BGFX 渲染引擎中着色器代码的调试方法

    在实时渲染的图形开发中,着色器代码(Shader)越来越复杂,于是单纯的靠经验和不断试错的开发和调试方法早已不能满足实际需求.使用调试工具进行调试,成为开发中重要的方法.Bgfx 是一款跨平台.抽象封 ...

  2. 在IntelliJ IDEA中多线程并发代码的调试方法

    通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法.让你在多线程开发过程中的调试更加的有的放矢. 我们将通过一个例子来学习.在这里,我编写了一个多线程程 ...

  3. vs中附加IIS进程的调试方法

    项目运行以管理员的身份进行运行否则附加不进去:

  4. Microsoft SDK 中Sample案例之Amcap項目 的运行方法(转)

    http://blog.csdn.net/erick08/article/details/7194575 Microsoft  SDK 中Sample之Amcap 的运行方法      写这篇文章的由 ...

  5. 【转】GDB中应该知道的几个调试方法

    文章来源:http://coolshell.cn/articles/3643.html GDB中应该知道的几个调试方法 2011年02月10日 陈皓 评论 40 条评论  70,776 人阅读 七.八 ...

  6. Vivado与SDK的联合调试方法-使用ILA

    首先介绍一下我的硬件平台:使用的开发板为米联客出的MIZ702,这个开发板与ZedBoard是兼容的. Vivado硬件调试有几种手段:ILA(集成逻辑分析器Integrated Logic Anal ...

  7. hi3559v100 sdk中双系统AMP架构的初步了解

    hi3559v100是海思推出的camera soc处理器.采用的是双核处理器.一个是a7,运行的linux3.18内核.一个是a17使用的是huaweiliteos操作系统,Hi3559V100 系 ...

  8. 微信支付.NET SDK 中的BUG(存疑)

    BUG出现在类文件WxPayData.cs中的FromXml(string xml)方法 /** * @将xml转为WxPayData对象并返回对象内部的数据 * @param string 待转换的 ...

  9. VS中附加进程的方式调试IIS页面,以及设置断点无效问题解决

    以前调试网站的时候都习惯是直接在解决方案中右键调试——启动新实例,后来发现这样的缺点有: 1.启动比较慢: 2.一些浏览器的request参数无法带入: 3.不特殊指定启动url的话,VS会将页面加载 ...

随机推荐

  1. hashlib模块,hmac模块

    6.11自我总结 1.hashlib模块(文件传输中将传输内容用指定算法进行处理) hash是一种算法(Python3.版本里使用hashlib模块代替了md5模块和sha模块,主要提供 SHA1.S ...

  2. selenium.common.exceptions.WebDriverException: Message: u'unknown error: cannot get automation extension\nfrom unknown error: page could not be found: chrome-extension://aapnijgdinlhnhlmodcfapnahmbfeb

    Python2.7 selenium3.4.1在使用chrome driver时报错:selenium.common.exceptions.WebDriverException: Message: u ...

  3. Linux实现删除撤回的方法。

    RM命令改造 vim /etc/bashrc   在文件的最前端添加如下代码   #修改rm命令 alias rm=delete  #命令别名,通过delete来实现rm改为mv alias r=de ...

  4. python爬虫入门一:爬虫基本原理

    1. 什么是爬虫 爬虫就是请求网站并提取数据的自动化程序 2. 爬虫的基本流程 1)发送请求 通过HTTP库向目标站点发送请求,即发送一个Request. 请求可以包含额外的headers等信息,等待 ...

  5. Python9-模块1-day19

    在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict.namedtuple和Ord ...

  6. 关于logging模块重复问题

    logger对象配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import logging # 获取一个新日志logger = ...

  7. Java-字符串大小写转换

    package com.tj; public class MyClass implements Cloneable { public static void main(String[] args) { ...

  8. rocketmq 问题

    1. 收不到消息-consumerOffset.json 信息错位 这种情况一般是,手动删除了store/commitlog目录里的数据等非常规手段造成了consumerOffset.json中记录的 ...

  9. 【bzoj2229】[Zjoi2011]最小割 分治+网络流最小割

    题目描述 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分 ...

  10. BZOJ 4811 [Ynoi2017]由乃的OJ ——Link-Cut Tree

    直接维护按照顺序经过每一段,初始的1可以变成什么,初始为0可以变成什么. 然后答案就可以和起床困难综合征一样贪心处理了. 写起来并不好写. 发现交换左右子树之后答案会改变,GG 调了一天,最后还是T掉 ...