好香的接口测试工具:Insomnia Rest Client

这是我从新近follow的一个推友 @tywtywtyw 的推文里拣到的宝。他在推文里说

放弃了 postman 和 postwomen, 来到了 insomnia

能比 Postman 更好?这勾起了我的好奇心。结果发现真香。

顺便说一下,他的口号是“Design and debug APIs like a human, not a robot.”

  1. 不用写脚本,可以指定当前请求依赖哪个请求,以及是使用缓存的请求结果,还是需要时再发新请求(通常我都会选择发新请求,毕竟token会过期)
  2. 最重要的键是 Ctrl+空格。这是 autocomplete 的热键。
  3. 界面相对易用。
  4. 有父环境和子环境的概念,公共的东西写到父环境里,能省一些时间
  5. 就像使用苹果的软件,你不需要专门保存你的接口,你写了,你run了,接口就自动存好了。

遇到一个坑:如果是在JSON里使用环境变量,并且这个变量是个字符串,得用双引号括住这个变量!

我已经决定扔掉 Postman 了。就是这么喜新厌旧。

How to let Supervisord wait 1 second before restarting my program?

It spent more than half an hour. Finally, I found this solution.... very simple!

#!/bin/bash
/usr/local/bin/noip2 -c /usr/local/etc/no-ip2.conf
sleep 1

noip sucks!

source

Database structure backup & Data dictionary automatically generation

Two bash script achieved the goals in this subject.

1. Exporting data dictionary

cat utils/exportDbDictionary 
if [ $# != 2 ] ; then
    echo "USAGE: $0 dbname tablename"
    echo " e.g.: $0 IDServer AspNetUsers"
    exit 1;
fi

document_path=/YourProjectName/documents/database

[ -d $document_path/$1 ] || mkdir -p $document_path/$1
mysqlshow $1 $2 | sed 's/+/|/g' | sed '1,2d' | sed '$d' | awk -F"[|]" '{print $2"|"$3"|"$5"|"$6"|"$7"|"$10}' | sed 's/ *$//g' > $document_path/$1/$2.md

People should always add comments to their field definitions. As soon as the definition of a table has been done, run this script could automatically generate a markdown table with the name of tableName.md.

2. export database structure without auto_incrment= statements

cat utils/backupDbStructure 
backupFile=/YourProjectName/documents/database/databaseStructure.sql
mysqldump -d --databases YourDB1 YourDB2 YourDB3 | sed 's/ AUTO_INCREMENT=[0-9]*//g' > $backupFile

When you made some changes to your database, run backupDbStruture script will automatically generate the latest table structure into one file. You could commit it later with your code change together.

.net core System.text.json Serialize & Deserialize

If the field names in your Model class are not exactly the same as in a JSON string, you will need adding an option to guarantee the behavior is what you want. For example, if you have got the following response text:

{"hello":"world"}

and you have a Model class below:

class SampleModel 
{
   public string Hello { get; set; };
}

You can see the property name in your Model class is "Hello" instead of "hello", the following code won't get an expecting result.

SampleModel s = JsonSerializer.Deserialize<SampleModel>("{\"hello\":\"world\"}");

you will get an object like

{
  "Hello": null 
}

You have to use an option below to get it to work.

SampleModel s = JsonSerializer.Deserialize<SampleModel>("{\"hello\":\"world\"}", new JsonSerializerOptions
            {
                PropertyNameCaseInsensitive = true,
            });

on the other hand, you have to use the following code to guarantee the serialize behavior:

SampleModel s = JsonSerializer.Serialize(new SampleModel() {Hello="world"}, new JsonSerializerOptions
            {
                DictionaryKeyPolicy = JsonNamingPolicy.CamelCase
            });

Thus you get {"Hello":"world"} instead of {"hello":"world"}.

System.text.json sucks.

Watched "St. Vincent (2014)"

I watched this film with Eric today evening. Gladly, he loves this film.