Python接口自動化-requests模塊之post請求


在上一篇Python接口自動化測試系列文章:Python接口自動化-requests模塊之get請求,介紹了requests模塊、

get請求及響應結果詳解。以下,主要介紹requests模塊中的post請求的使用。

 

一、源碼解析

 

def post(url, data=None, json=None, **kwargs):
    r"""Sends a POST request.

    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
        object to send in the body of the :class:`Request`.
    :param json: (optional) json data to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response
    """

    return request('post', url, data=data, json=json, **kwargs)

post請求參數解析:

  • url: 請求的url,必填;

  • data: 選填,請求參數;

  • json: 選填,請求參數;

  • kwargs:選填,可以傳入headers、cookies等。

      

二、data、json區別

 

小伙伴們看完可能有點懵逼,data和json有啥區別呀,什么時候傳入data,什么時候傳入json。

 

舉個栗子:

data = {
    "name":"vivi"
}
print(type(data))
 
        

聰明的小伙伴立即搶答了,打印的是字典類型。

 

那如果想把字典轉換為json字符串呢,需要引用json模塊。

import json
data = {
    "name":"vivi"
}
data = json.dumps(data)
print(type(data))
 
        

敲黑板

  • 不管json是str還是dict,如果不指定headers中的content-type,默認為application/json;

  • data為dict時,如果不指定content-type,默認為application/x-www-form-urlencoded,相當於普通form表單提交的形式;

  • data為str時,如果不指定content-type,默認為application/json。

 

重點來了,post請求參數到底是傳data還是json,這時候我們要看請求頭里的content-type類型(具體參照接口文檔,沒有接口文檔的抓包)。

 

如果請求頭中content-type為application/json,  為json形式,post請求使用json參數。

 

如果請求頭中content-type為application/x-www-form-urlencoded,為表單形式,post請求時使用使用data參數。

 

    

 

 

三、form形式發送post請求

 

當前接口的請求類型為application/x-www-form-urlencoded。

# 導入requests模塊
import requests
# 請求url
url = "http://127.0.0.1:8000/user/login"
# 請求參數
payload = {
    "mobilephone":"1530272****",
    "pwd":"123456"
}
# form表單形式,參數用data
res = requests.post(url, data=payload)
print(res.text)

響應結果為:

{
    "status": 1,
    "code": "10001",
    "data": null,
    "msg": "登錄成功"
}

四、json形式發送post請求

當前接口的請求類型為application/json。

# 導入requests模塊
import requests
# 請求的url地址
url = 'http://127.0.0.1:8000/user/login/'
# 請求頭
headers = {"content-type":"application/json"}
# payload 為傳入的參數
payload = {"username":"vivi","password":"123456","remember_me":"false"}
# json形式,參數用json
res = requests.post(url,json=payload,headers=headers)
print(res.text)
 
        

響應結果為:

 
        
{
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InZpdmkiLCJleHAiOjE1ODY1OTUyOTEsImVtYWlsIjoidml2aUBxcS5jb20ifQ.1RGrO6hSWHi9RDXjYuqY0UCPKMmQvaybpHvYqC0dCis",
  "user_id": 1,
  "username": "vivi"
}

 

 

問題來了,如果請求類型為application/json,我偏要傳入data參數呢?

 

先按我們正常思維走一波:

import requests
payload = {"username":"vivi","password":"123456","remember_me":"false"}
header = {"content-type":"application/json"}
url = 'http://127.0.0.1:8000/user/login/'
res = requests.post(url,data=payload,headers=header)
print(res.text)
 
        

響應結果:請求錯誤

{"code":400,"data":[],"message":"Input error"}

請求類型為application/json,如果想用data傳參,需要將字典類型數據轉換為json字符串。

import requests
import json
payload = {"username":"vivi","password":"123456","remember_me":"false"}
header = {"content-type":"application/json"}
# 字典轉換為json串
data = json.dumps(payload)
url = 'http://127.0.0.1:8000/user/login/'
res = requests.post(url,data=data,headers=header)
print(res.text)
 
        

總結:本文主要講解post源碼,data、json參數應用場景及實戰。接口使用的本地服務,如果大家想練手,可以使用公司項目或網上項目自行實戰。

 

下一篇介紹:接口自動化之 cookie、session原理及應用。

 

更多系列文章,可以關注微信公眾號:ITester軟件測試小棧



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM