现在开发是前后端完全分离的,在公司里面很多接口都和登陆态相关联起来。从而使得我在需求开发的时候依赖于前端同事打包完之后才开始测试自己的需求功能。所以比较耗费时间和精力。但是我们的服务接口是不依赖登陆态的,为了测试自己的服务接口,需要模拟发送HTTP请求,以便后面偷懒。本文就此介绍一下如何解决此问题。

语言选择以及依赖包

为了能够快速解决此问题,首先需要找到合适的工具,俗话说,“工欲善其事,必先利其器。”
在程序设计中首先就是语言的选择,相比于java,对python更为熟悉一点。说句皮外话,
虽然在公司用java开发,但是对java熟悉程度不如python,汗颜啦。回归正题,选好了
语言之后,紧接着就是如何模拟发送HTTP请求。google一番找到一个第三方包urllib3
如何安装urllib3以及使用文档教程

实现

现在我们来看看,如何使用urllib3包来模拟发送HTTP的POST请求,请求参数是JSON格式。为了能够使用urllib3模块,需要在使用导入urllib3模块,代码:import urllib3。使用PoolManager
实例来发送请求,它已经为我们封装处理好了连接池以及线程安全问题,我们没有必要再次徒手开发一套。其实,urllib3中最为核心关键的方法是request方法,它指定发送请求的方式、请求地址请求的参数。具体步骤如下:

  • 指定请求方法以及url;
  • 将请求的参数编码,然后作为body的值;
  • 设置请求头部的Content-Type为JSON格式.

下面是一个示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#-*- coding:utf-8 -*-
import urllib3
from urllib import urlencode
import json

def testEsaInterface(url, param):
http = urllib3.PoolManager()
try:
r = http.request('POST',url, body=json.dumps(param).encode('utf-8'),headers={'Content-Type': 'application/json'})
if r.status == 200:
print r.data
except urllib3.exceptions.MaxRetryError as e:
print repr(e)

如果想对返回的结果进行处理,先将返回的数据进行解码以及反序列化,可以使用decode函数解码,loads函数反序列化。然后采用类似于下标的访问方式获取相关字段的值。示例代码如下:

1
2
3
res = json.loads(r.data.decode('utf-8'))
if ("906" == res['data']['returnCode']):
# to do something

下图是我测试人脸识别功能一个测试结果:
测试结果

postman发送post请求

弄完工具之后,本来想再做一个网页版的,后面发现chrome中有一个插件postman,
可以解决我的问题,突然发现重复造轮子咯。下面简单介绍一下,如何用postman发送
post请求,其中请求的参数为JSON格式。步骤如下:

  • 选择发送请求的方式为 POST;
  • 输入访问的URL
  • 在headers标签页输入 Content-type, 对应的值为 application/json;
  • 在body标签页面,选择raw,然后在输入JSON格式的请求参数;
  • 最后点击send按钮即可.

是不是发现很简单,如果你觉得还是不清楚,可以参考此博文

本文仅仅简单介绍了urllib3模块发送HTTP的POST请求方式,还有很多功能需要大家自己去发掘。

参考