HTTP基础调试

使用命令行以及客户端调试HTTP接口。HTTP的报文协议= Start Line + Header + CRLF + Body。其中Start Line又叫起始行,在请求中是请求行;在响应中是状态行。为本篇通过HTTP请求高德API接口,实现IP定位以及天气查询。

1.准备

使用任何高德的WEB服务API均需要提供key,简单理解为密钥。如果在HTTP请求时没有提供合法的key值,则高德API接口会返回INVALID_USER_KEY报错提示。
点击高德地图官网开发者后台尝试申请key。假设申请成功的key如下

1
47478abb752cf12e1a6c91ab0892cae0

根据高德服务调用量说明[1], 个人普通开发者每日请求次数(或者叫配额)

  • 5000次 IP定位
  • 300000次 天气查询(预报)

1.1 IP定位文档

根据高德的IP定位文档[2],HTTP的请求方式为GET,请求URL是

1
https://restapi.amap.com/v3/ip

在请求中提供key值。如果在HTTP请求中不提供IP地址参数,则取客户http之中的请求来进行定位,即实现自动定位。如果请求成功则会拿到城市编码的值,即abcode

IP定位请求只支持国内的IP地址,如果是非法IP或者国外IP则其返回的结果中provincecity属性均会返回空,也就是没有值

1.2 天气查询文档

根据高德的天气查询文档[3],HTTP的请求方式为GET,请求URL是

1
https://restapi.amap.com/v3/weather/weatherInfo

在请求中提供key以及IP定位查询到的abcode的值。注意:abcode的值应该赋值给city的键名。请求成功后则获取到当前城市的天气信息。

2.命令行

2.1 CURL命令行

一般Linux系统默认安装了curl,直接开始测试,以下的命令包含&& echo仅为了换行显示,对HTTP请求没有影响

2.1.1 请求定位

1
curl https://restapi.amap.com/v3/ip -d key=47478abb752cf12e1a6c91ab0892cae0 && echo

curl命令行请求定位

根据IP定位请求结果,城市编码abcode的值为440100

2.2.2 查询天气

1
curl https://restapi.amap.com/v3/weather/weatherInfo -d key=47478abb752cf12e1a6c91ab0892cae0 -d city=440100 && echo

curl命令行查询天气

2.2 HTTPie命令行

2.2.1 安装

1
sudo apt install httpie -y

2.2.2 请求定位

1
http https://restapi.amap.com/v3/ip key==47478abb752cf12e1a6c91ab0892cae0

httpie命令行IP定位

2.2.2 查询天气

1
http https://restapi.amap.com/v3/weather/weatherInfo key==47478abb752cf12e1a6c91ab0892cae0 city==440100

httpie命令行查询天气

3.HTTPie

⭐HTTPie[4]客户端可以非常优雅地调试HTTP,完全免费,不仅能够兼容各个平台,而且能够跨平台同步HTTP工作区,使用github账户可以快速登陆。

3.1 网页客户端

3.1.1 IP定位

  1. 左侧边栏空白区域右键点击Draft request
  2. 重命名untitledAMap IP API
  3. 右侧顶部区域选择HTTP请求方法为GET
  4. URL处粘贴需要请求的URL
  5. Params区域中添加键值对,输入键名为Key,键值从高德后台复制key
  6. 点击Send按钮开始请求
  7. 观察请求结果,最右侧显示HTTP响应报文,HTTP状态行,响应头以及响应体
  • 响应行 = HTTP版本号 + HTTP状态码 + HTTP状态码补充解释
  • 响应头可以点击展开查看具体的键值对
  • 响应体可以选择不同格式展示,JSONRAW以及XML

HTTPie网页客户端IP定位

观察HTTP响应报文:状态行显示200 OK,说明本次HTTP请求成功,而且响应体里的JSON键值对"status":"1"以及"info":"OK"均说明请求的URL以及Params参数合法。但是却没有查询到具体的城市。出现该问题的原因是Httpie网页客户端是由美国的服务器主机提供,虽然客户端运行在本地的浏览器。但是客户端发起HTTP请求的时候,实际上是从美国服务器IP去访问高德的IP定位接口的。根据高德的IP定位文档,国外的IP返回空。使用HTTPie本地客户端可以解决这个问题。

终端查询httpie.io的IP以及属地信息命令

1
curl https://ipinfo.io/$(dig +short httpie.io) && echo

终端查询httpie.io信息

根据查询信息可以看到httpie.io运行于美国的服务器主机。或者终端查询域名的解析到的IP地址

1
nslookup httpie.io

再复制该IP地址到IP查询的WEB服务端进行查询,一样可以判断出由美国主机提供的服务。

网页查询httpie.io信息

高德IP定位接口省份以及城市显示为空

3.1.2 天气查询

步骤与IP定位相同,更换URL以及添加Params参数city:440100

HTTPie网页客户端天气查询

3.2 本地客户端

下载安装HTTPie本地客户端且登陆账号之后,本地客户端会自动同步网页客户端创建的HTTP工作区

3.2.1 IP定位

HTTPie本地客户端IP定位

3.2.2 天气查询

HTTPie本地客户端天气查询

4.分析Header

以HTTP响应头Header中的Content-Length为例,尝试分析HTTP请求。Content-Length用于表示响应体Body的大小,且特指字节大小,非字符大小。如果响应体中包含中文,以UTF-8编码的标准,一个中文字符占用3个Byte。以字符的方式统计可能会出现错误,但是以字节则不会。测试方法如下:

  • 在HTTPie本地客户端的IP定位请求成功后,设置RAW方式显示Body信息,再点击Copy body按钮
  • 打开字符串转16进制在线工具,粘贴至输入框,点击字符串转16进制按钮,点击复制结果按钮
  • 打开在线字数统计,粘贴至输入框,在输入框下方会显示字符数,往下滑动看到右下角的计算器,将字符数除以2就能得到实际的Content-Length
  • 展开HTTPie的Header,查看Content-Length键值对,对比刚刚计算的Content-Length是否一致

字符串转16进制的时候,一个字节占用两个字符,因此需要除以2才能算出实际的字节数。比如第一个字符{对应的16进制是7B

计算IP定位的Content-Length

计算天气查询的Content-Length

有一些字符串转16进制的在线工具可能会自动删除空格,会导致计算的Content-Length与实际的不一致,比如BEJSON的字符串转16进制的工具就会出现这个问题,需要注意。

参考


HTTP基础调试
https://blog.gogo.uno/2024/02/22/http-basic/
作者
Orionxer
发布于
2024年2月23日
更新于
2024年8月4日
许可协议