请求体不是json类型的如‘username=admin&password=password&Login=Login&user_token=0e0419bcc8f493954d0df0fc96dee14e’,使用python中的 requests的post方法时如何传递
时间: 2024-09-26 10:16:12 浏览: 18
当你需要发送非JSON格式的查询字符串(query string)作为POST请求体时,可以在`requests.post`函数中使用`params`参数而不是`json`。这是一个例子:
```python
import requests
url = 'http://example.com/login' # 网络地址
params = {
'username': 'admin',
'password': 'password',
'Login': 'Login',
'user_token': '0e0419bcc8f493954d0df0fc96dee14e'
}
response = requests.post(url, params=params)
# 如果响应有状态码200,表示成功
if response.status_code == 200:
print(response.text)
else:
print(f"请求失败,状态码:{response.status_code}")
```
这里的`params`参数是一个包含键值对的字典,会被自动转化为URL编码后的查询字符串附加到POST请求的URL之后。注意,对于这种形式的数据,一般在HTTP协议中,POST请求体通常是不需要的,除非API有特殊规定。大多数情况下,表单数据、键值对等格式适合用这种方式传递。
相关问题
# NOTE: Generated By HttpRunner v3.1.6 # FROM: har\.\xiaoqu.har import allure from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase class TestCaselogin(HttpRunner): config = Config("testcase description").verify(False).variables(**{"url": "http://iot.homecommunity.cn"}) teststeps = [ Step(RunRequest("============登录============").post("${url}/api/user/login") .with_json( {'username': 'admin2', 'password': 'hc123456'}) .extract().with_jmespath("body.data.token", "token").validate().assert_equal( "body.msg", "成功", "返回登录成功").assert_equal("body.code", 0, "返回code正确"))] if __name__ == '__main__': TestCaselogin().test_start()我要做登录账号密码的数据驱动,实现多条验证case该怎么写
你可以使用 HttpRunner 的数据驱动功能,将多组账号密码数据存储在 Yaml 文件中,然后在测试用例中通过数据驱动来实现多条验证 case。示例代码如下:
```python
# -*- coding: utf-8 -*-
# 该代码仅为示例,具体实现需要根据你的测试环境和需求进行修改
import os
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase, RunTestSuite
class TestLogin(HttpRunner):
config = Config("登录接口测试")
testcases = []
# 读取 Yaml 文件中的数据
with open(os.path.join(os.getcwd(), "test_data.yaml"), encoding='utf-8') as f:
test_data = yaml.safe_load(f)
# 循环遍历数据,生成多条测试用例
for data in test_data:
testcase = {
"name": data["case_name"],
"teststeps": [
Step(
RunRequest("登录接口")
.post("${config.host}/api/user/login")
.with_headers(**{"Content-Type": "application/json"})
.with_json(data["request_body"])
.extract()
.with_jmespath("body.data.token", "token")
.validate()
.assert_equal("body.code", 0, "返回 code 正确")
.assert_equal("body.msg", "成功", "返回登录成功")
)
]
}
testcases.append(testcase)
if __name__ == "__main__":
TestLogin().test_start()
```
其中,`test_data.yaml` 文件中的数据格式如下:
```yaml
- case_name: "用户名和密码正确"
request_body:
username: "admin"
password: "123456"
- case_name: "用户名正确密码错误"
request_body:
username: "admin"
password: "123"
- case_name: "用户名错误密码正确"
request_body:
username: "admin123"
password: "123456"
```
你可以根据实际需要修改数据格式和测试用例名称。
$form = $this->request->post(); $adminUser = $this->_adminUserModel->getAdminUser(array('username'=>$form['username'])); if (empty($adminUser)) { return $this->json(40003,'用户不存在'); } if (!$adminUser['is_active']) { return $this->json(40003,'用户未激活'); } if (!password_verify($form['password'], $adminUser['password'])) { return $this->json(40003,'密码错误'); } // 请求验证token $startTime = time(); $ExpireTime = time()+7200; $userId = $adminUser['admin_user_id']; $userName = $adminUser['username']; $access_token = \app\common\Tools::generateJwt($startTime, $ExpireTime, $userId, $userName); $data = array( 'access_token' => $access_token ); // 记录登录时间 $this->_adminUserModel->updateAdminUser($userId, array('login_time'=>date('Y-m-d H:i:s'))); return $this->json(20000,'登录成功', $data); }这段代码的请求头是哪些
这段代码中并没有给出请求头的具体内容,所以无法回答请求头是哪些。但可以推测,这段代码接口需要客户端发送POST请求,请求体中包含用户名和密码,请求头中可能需要包含Content-Type字段,值为application/json或application/x-www-form-urlencoded。另外,如果该接口需要进行身份验证,则需要在请求头中携带token等验证信息。