urllib.request打开post参数URL地址(接口测试,json测试数据保存在exl中)

代码主要实现的是接口测试,测试数据是json类型,保存在exl中

# -*- coding : UTF-8 -*-
import urllib.request
import urllib.error
import json
import urllib.parse
from Interface_Test.Open_exl import OpenExl  #导入打开exl文件
import ast

class TestLogin():
    def __init__(self, url = '', data = None):
        self.user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
        self.header = {'User-Agent': self.user_agent}
        self.url = url
        self.html = '默认内容是空的~~~'
        #data数据类型需要是字节型,所以需要类型转换
        self.data = json.JSONEncoder().encode(data).encode('utf-8')
        #self.data = json.dumps(data).encode('utf-8')
        print(self.data)

    def open_url(self):
        try:
            self.req = urllib.request.Request(self.url, self.data, self.header)
            self.response = urllib.request.urlopen(self.req)
            self.html = self.response.read()
            self.is_status = self.response.getcode()
            print('---------接口状态码%s,页面可以正常打开---------' % self.is_status)

        except urllib.error.URLError as e:
            print('\033[1;31;40m')
            print('-----------------页面打不开-------------------')
            print(e)
            print('\033[0m')
            self.reason = e

        return self.html


if __name__ == "__main__":
    #接口URL地址
    url = 'http://xxx/xxx/xxx/API.aspx?cmd='
    #定义获取接口名和接口参数路径
    exc_file = 'D:/xxxx/xxxx/xxxx.xls'
    #打开exl工作表单
    exl_data = OpenExl(exc_file, 0)
    #获取接口名
    interface_name = exl_data.excel_table_data()
    #print(interface_name)
    #获取接口参数
    interface_data = exl_data.excel_table_data(1)
    #print(interface_data)

    #定义计数器,用户获取接口同行参数
    count = 1
    for each_interface in interface_name[1:]:
        new_url = url + each_interface
        print(new_url)
        #exl里获取的参数是字符串类型,需要转换为字典类型,然后传入主类中进行类型转换
        data = ast.literal_eval(interface_data[count])
        #print(data)
        count += 1
        login = TestLogin(new_url, data)
        html = login.open_url().decode('utf-8')
        #接口返回的字符串存在urlencode编码,需要unquote进行解码
        html = urllib.parse.unquote(html)
        print(html)


需要注意三个点:

1.打开URL时,参数有时传入的是json类型的,但是post进去的数据类型是byte类型的,需要转码

json.JSONEncoder().encode(data).encode('utf-8')
或者使用 json.dumps(data).encode('utf-8')进行转码

2.从exl中获取的值是str类型的,但是程序要求传入的值是dict类型的,此时需要类型转换

ast.literal_eval(interface_data[count])

3.接口返回的数据类型有时是‘%e6%96%b0%e6%ac%be%e6%98%a5’这样的,原因是接口返回的值是urlencode编码的,需要通过unquote进行解码:

urllib.parse.unquote(html)

你可能感兴趣的:(python)