Http 协议请求报文的本质就是一堆字符串,只是这堆字符是有格式的,发送方跟接收方都需要按照这个格式来拼接和拆解内容。我们要实现一个 Web 服务,了解这个是最基本的要素。以下截图的报文是通过 tcpflow(一款功能强大的、基于命令行的免费开源工具)在 Linux 系统抓包获取的。sudo tcpflow -c port 8080
大家都知道 Python 对格式要求特别严,格式不对就会出现错误,编译过不了情况。PyCharm 允许你根据在代码样式设置中指定的要求重新格式化代码。
我们知道格式化的命令:说明Windows/LinuxMacOS格式化代码Ctrl+Shift+H⌘+⇧+H如果我们忘记了,也可以在命令面板里面搜索:HTMLPrettify 点击即可格式化当前文档。
错误报告包含设备日志、堆栈轨迹和其他诊断信息,可以帮助我们查找和修复应用中的错误。我们可以通过以下几种方式从设备上获取错误报告。
let 不允许在同一个函数或块作用域中重复声明同一个变量,否则会引起语法错误(SyntaxError)。{ let x = 10; let x = 11;}// Uncaught SyntaxError: Identifier 'x' has already been declared在上面的代码中报错,所以,同一个变量名不可以在同一个作用域内重复声明。{ let x = 10; var x = 1;}即使使用 var 去声明也是不可以的,我们知道当使用 let 声明的时候 x 已经是一个死区了,不可以被重复声明了。Tips:注意在 switch 语句中只有一个块级作用域,所以下面这种情况也是会报错的。let x = 1;switch(x) { case 0: let num; break; case 1: let num;//重复声明了 break;}// 报错如果把 case 后面的语句放到块作用域中则不会报错。let x = 1;switch(x) { case 0: {//块 let num; break; } case 1: {//块 let num;//这里就没有关系了,可以正常声明 break; }}上方代码,case 后面的语句 let 变量声明在放到块中,是单独的作用域,所以就不会报错。
格式化时间可以理解成把时间处理成想要的格式,如年-月-日 时:分;秒。通过 Date 对象提供的一些方法,可以获得到对应的时间属性。假如想把时间格式化成年/月/日 时:分:秒的形式:var date = new Date();var YYYY = date.getFullYear();var MM = date.getMonth() + 1;var DD = date.getDate();var hh = date.getHours();var mm = date.getMinutes();var ss = date.getSeconds();console.log([YYYY, '/', MM, '/', DD, ' ', hh, ':', mm, ':', ss].join(''));通过 Date 对象提供的获取年、月、日、时、分、秒的方法获取到对应的值,最后按照想要的格式拼接即可。需要注意的是 getMonth() 方法返回的月份是 0 至 11 ,更像是月份的索引,实际上对应的月份还要加上 1 。
你可以重新格式化代码的一部分、整个文件、文件组、目录和模块。相关设置:PyCharm/File -> Preference/Settings -> Editor -> General -> Code Style:step1:在编辑器中打开文件,按 ⌥ ⌘ L (Ctrl+Alt+L) 或者 在 "Project"工具窗口,右键单击该文件在弹出菜单中选择 Reformat Code。(继续按 Shift ,可以选择更多文件。)Optimize imports(优化导入):如果要删除未使用的导入、添加缺少的导入或组织导入语句,请选择此选项。Rearrange entries(重新排列条目):如果需要根据代码样式设置中指定的排列规则重新排列代码,请选择此选项。Clean up code(清理代码):选择此选项以运行代码清理检查。Only VCS changed text: (仅仅VCS改变的文件):如果选中此复选框,则重新格式化将仅适用于本地已更改但尚未签入存储库的文件。此复选框仅适用于版本控制下的文件。step2:上图列出一些代码格式问题,选中优化导入及清理代码项,点击 OK。相应的问题都被修改了。
默认情况下,错误报告是 ZIP 文件。ZIP 文件名类似 bugreport-BUILD_ID-DATE.zip,它可能会包含多个文件,但最重要的文件是 bugreport-BUILD_ID-DATE.txt。此文件就是错误报告,它包含系统服务 (dumpsys)、错误日志 (dumpstate) 和系统消息日志 (logcat) 的诊断输出。系统消息包括设备抛出错误时的堆栈轨迹,以及从所有应用中使用 Log 类写入的消息。ZIP 文件中有一个 version.txt 元数据文件,其中包含 Android 版本号,而且启用 systrace 后,ZIP 文件中还会包含 systrace.txt 文件。Systrace 工具可以获取并显示应用进程和其他 Android 系统进程的执行时间,从而帮助分析应用的性能。dumpstate 工具会将文件从设备的文件系统复制到 ZIP 文件的 FS 文件夹下,以便我们引用它们。例如,设备中的 /dirA/dirB/fileC 文件会在 ZIP 文件中生成 FS/dirA/dirB/fileC 条目错误报告文件结构如下:
我们使用 strftime 来格式化时间。实例:time = Time.newtime.strftime("%d/%m/%Y") # "10/04/2020"time.strftime("%k:%M") # "0:00"time.strftime("%I:%M %p") # "12:00 AM"time.strftime("Today is %A") # "Today is Friday"time.strftime("%d of %B, %Y") # "10 of April, 2020"time.strftime("Unix time is %s") # "Unix time is 1586448049"如您所见,此方法非常灵活。您可以获取不带日期的时间,也可以获取格式正确的日期以及当前月份的年,日和名称。方法时机简介(调用的时机)%d每月的某天(01…31)%m一年中的月份(01…12)将%-m用于(1…12)%k小时(0…23)%M分钟%S秒(00…60)%I小时 (1…12)%pAM/PM%Y年%A星期几(名称)%B月(名称)
除了图像、多媒体这种丰富的交互效果之外,网页中还经常会用到通讯录、统计报表这种格式化的交互效果,这时候就用到了表格元素。
Maven 的默认配置中,会在 target\surefire-reports 目录下生成测试报告。我们执行 mvn clean test,就可以观察到该目录生成。我们可以在 txt 格式的文档中看到生成的测试报告。这里的测试报告基本上和控制台输出的内容是类似的。大家可能也注意到了,我们在执行测试用例的时候,同时生成了两种类型的文件,一种是 txt 格式,另一个则是 XML 格式。txt 格式: 为了让执行测试用例的开发者更加直观的看到测试用例的运行结果;XML格式: 更多的是为了支持其他工具的解析。
前面的小节我们介绍了调试布局方面的知识,可以有效的帮助我们解决布局显示异常,本小结我们学习如何获取和分析错误报告。
出参的格式主要有2种不管成功失败都是固定的字段。成功了只返回业务实体对象,失败了只返回错误信息。
JSON 几乎是目前前后端交互最常用的数据格式,所以 JSON 对象使用的频率也很高。在使用 JSON.parse 反序列化的时候,如果 JSON 格式不符合规范,是会报错的,日常开发中建议封装一层 JSON 的方法,将错误集中处理,方便定位与上报错误。
我们在编译时经常会遇到一些报错信息,但是有时候会排查很久才知道原因所在。其实编译时的信息在 Gradle 日志中我们都可以看到。当我们编译时,在 AndroidStudio 的左下角会看到如下一个 Build 按钮:当我们点击 Build 按钮,我们点击这个按钮就会看到具体的日志信息。我们就可以看到具体的错误日志了,具体我们可以搜FAILURE: Build failed with an exception.这句后面接着的就是具体的错误信息,包括出错文件及原因。我们这里看到说图片文件的名称只能是数字和小写字母,这里包含了 A 这个大写字母,所以编译的时候抛出了异常。Tips: 当我们遇到编译报错时,我们可以在 Build 这个窗口中输入 FAILURE: Build failed with an exception. 搜索到这句信息的位置,后面紧接着的就是具体的错误信息。
通过使用字符串 + 连接运算可以将多个字符串拼接起来,例如:>>> name = 'tom'>>> city = 'nanjing'>>> 'My name is ' + name + ', I live in ' + city + '.''My name is tom, I live in beijing.'在第 3 行,使用字符串 + 将以下 5 个字符串拼接起来:'My name is ’name', I live in ’city‘.’最终得到字符串 ‘My name is tom, I live in beijing’,像这样将多个字符串拼接起来的表达式非常不直观,Python 提供了字符串格式化用于简化拼接多个字符串。
xlwt 除数据写入外,还可以单元格格式设置和单元格样式设置,一共分为 6 组,包括数字格式、字体、对齐方式、边框、填充、保护。使用步骤如下:步骤 1:初始化样式import xlwttitlestyle = xlwt.XFStyle() # 初始化 XFStyle 对象步骤 2:配置样式根据提供的属性进行单元格样式设置,如字体、边框、对齐方式设置等。步骤 3:应用样式import xlwttitlestyle = xlwt.XFStyle() # 初始化XFStyle对象...省略部分代码ws = wb.add_sheet("sheet1")ws.write_merge(0, 1, 0, 5, "班级学员名单", titlestyle) #应用样式创建和配置好的 XFStyle 对象需要与写入方法结合使用,如上述代码中,将创建好的 titlestyle 应用到了标题上。xlwt 中常用格式属性分组,见下表。分组描述 Font 关于字体相关设置,如字号、字体、加粗等 Alignment 水平和垂直对齐,文本换行,缩进,方向 / 旋转,文本方向 Borders 边框线条样式和颜色 Pattern 背景区域样式和颜色下面我们针对每一项的使用进行单独介绍。
业务码不属于 Http 协议的成员,是实践中的产物。它是定义在返回的消息实体中的,并没有固定的格式,但无非就是下面3种模块。【错误级别(可选)】-【功能模块(必要)】-【具体错误编号(必要)】错误码一般由 5~6 位整数组成,例子如下:模块模块编码错误编码描述库存10001库存不足库存10002盘盈库存10002盘亏资金20001参数不正确
借助于 tolist(),可以快速把 ndarray 格式的数组,转变为列表,方便在某些情况下使用。案例把 arr0 转化为列表:arr0.tolist()out: [[100, 1, 2, 3], [4, 5, 6, 7]]可以看到,对于二维数组,转化后的结果是一个两层嵌套列表。
在严格模式下,变量必须被声明才能使用,否则会报错。// 非严格模式下number = 1;console.log(number); // 输出:1// 严格模式下'use strict';number = 1; // 报错:ReferenceError: number is not defined
对严格模式大多数需要注意的是他带来的一些语法上的改变,特别是有些写法,在之前是不会报错的,开启严格模式后就会报错,如果没有进行错误处理,就会导致程序的中断。以上对严格模式下的改变不一定是全部,可以参考 MDN 的文档。
这些关键字目前没有特殊功能,但是未来可能会有。其中 enum 关键在在严格和非严格模式下都不能使用,其余的目前只在严格模式下无法使用。var enum = 1; // 报错:Unexpected strict mode reserved wordvar package = 1; // 通过'use strict';var package = 1; // 报错:Unexpected strict mode reserved word以下是被未来关键字:enumimplementspackagepublicinterfaceprivatestaticprotectedlet
scheme 一般指的是协议,URI 的通用格式并没有太多限制,一般是如下,以 scheme 开头,冒号 “:” 分隔开。 <scheme>:<scheme-specific-part>虽然 URI 的格式没怎么限制,但是不同 scheme 一般会遵循下面的格式来定义。<scheme>://<authority><path>?<query>以 scheme = http 加以说明: http://www.imocc.com:80/index.htm?id=3937Http 的 <authority>模块一般不会写在路径上面,即使是 Basic Authorization 也是将用户名密码 base64(user:passwd) 写在 head 里面。下面的例子说明 RUI 的一般用法:ftp://ftp.is.co.za/rfc/rfc1808.txt;gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles;http://www.math.uio.no/faq/compression-faq/part1.html;mailto:mduerst@ifi.unizh.ch;news:comp.infosystems.www.servers.unix; telnet://melvyl.ucop.edu/0
JavaScript 的严格模式是使用受限制的 JavaScript 的一种方式,从而隐式地退出“草率模式”。严格模式不仅仅是一个子集:这种模式有意地与普通情形下的代码有所区别。(MDN)严格模式为 JavaScript 提供了一个更严格的运行环境。开启严格模式后,部分特性会发生改变,如 this 指向 window 的函数不再指向 window,而是变成了 undefined。function Test() { 'use strict'; console.log('this:', this);}Test(); // 输出:this: undefined
服务器返回的数据格式,应该尽量使用 JSON,避免使用 XML。什么是 JSON 呢?什么又是 XML 呢?两种数据格式的简单举例如下:# JSON{"name":"XiaoMing","age":"12","gender":"male"}# XML<?xml version="1.0" encoding="UTF-8" ?> <name>XiaoMing</name> <age>12</age> <gender>male</gender> 通过上面的对比可以看出,JSON 数据形式要远比 XML 的数据形式来得简单和易懂,所以现在的 Web 开发中 JSON 数据格式已经开始全面取代 XML 应用在实际开发中。
在非严格模式下,函数的 arguments 可以被重新赋值,在严格模式下,做赋值操作会报错。function fn() { console.log(arguments); arguments = 1; console.log(arguments);}fn(1, 2, 3);'use strict';function fn() { console.log(arguments); arguments = 1; console.log(arguments);}fn(1, 2, 3);
在函数顶端协商 'use strict' 字符串,就可以打开整个函数的严格模式。function testWith() { 'use strict'; var person = { name: '鸽子天王', age: 12, }; var age = 11; with (person) { console.log(name); console.log(age); }}testWith();在严格模式下是不提供 with 语句的调用的,所以这里会爆 Strict mode code may not include a with statement 错误。
嵌套格式是 Sass 中的默认输出格式,这种格式选择器和属性都会独占一行,能更好的反应出 HTML 元素和样式的关系,同时缩进也会与 Sass 中的缩进保持一致,一般来说这种格式使得我们的样式结构更清晰、更易读。我们举例看下这种格式:.box { width: 100px; }.box2 { width: 200px; height: 100px; } .box2 p { color: red; }
展开格式就像我们平时手写 CSS 的格式一样,属性、选择器都会独占一行,属性会缩进,选择器不会缩进而是顶头的,前面章节中我们演示的例子转为的 CSS 代码就都是展开格式的,我们举个例子看下这种格式:.box { width: 100px;}.box2 { width: 200px; height: 100px;}.box2 p { color: red;}.box2 .main { width: 100%; heigth: auto;}从上面的代码就可以看出来,这种格式的缩进、换行等其实和我们平时项目中写的 CSS 的格式是一样的。
产生原因:没有设置好正确的格式导致乱码。解决方案:修改格式,步骤如下:主要思路是把文档的格式改成UTF-8,保存即可。