在实际工作中,我们的Django经常遇到请求别人,然后别人回调的情况。回调的话,大概率就是对方以POST来请求我们的接口,之前写过如何编写一个Restful API,可以看一下:https://brucewayne2099.github.io/2020/05/27/%E4%BD%BF%E7%94%A8Django%E7%BC%96%E5%86%99restful-API/
那么说明一下当前的背景:
Django == 3.12.0
Python == 3.8.1
Postman == v9.15.13
对外暴露的接口是:http://域名/naxx/moneylost,同时在serializers.py
里指定必须传入的字段是title
, actual_value
,在数据库限制他俩都是varchar(20)
。而且在models.py
里也配置了该表和title
, actual_value
。
POSTman发起POST请求
怎么安装postman这里不说了,这里就说怎么用。
首先先把请求方式由默认的GET调整成POST,然后在界面的Header里手动在KEY的地方输入Content-Type
,对应的value就是application/json
:
然后在Body里,手动填写我们上面规定的必须填写的’title’和’actual_value’,以json的形式输入:
然后点击Send,就能看到结果了。然后再去数据库查看,已经成功了:
Python发起POST请求
那么用python去实现的话,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#!/usr/bin/python
import requests
import json
# url="https:/域名/API/API接口名?参数1=对应的值1&参数2=对应的值2&字典参数={'aaa':'value1','bbb':'value2','ccc':'value3'}"
# r = requests.request("POST",url)
# print (r.status_code)
# print (r.json())
# print (type(r.json()))
monitorurl = 'http://域名/naxx/moneylost/'
payload = {'title': '对应的值', 'actual_value': 123123}
monitor_response = requests.post(monitorurl, data=payload)
monitor_data_json = json.loads(monitor_response.text, strict=False)
print('得到的monitor-json是:\n', monitor_data_json)
这里上面的是用两种不同的方式POST到目标。
排错
这里主要有两个错误,第一就是json.loads
的时候可能会爆json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
,这个的原因就是你要单拿出来看看请求的text是不是json,大概率拿到的是网页的形式,所以自然不会被成功的json.loads
,所以这里要添加一个try…except来防错。
第二个错误就是提交的时候发现django.core.exceptions.ImproperlyConfigured: Field name XXX is not valid for model XXX
。这个原因主要就是串行器serializers.ModeSerializer
中调用的models里面的字段对不上。比如你的models.py
里 A表的字段是aaa,但是你在serializers.ModeSerializer
对A表的调用的字段是aaaa,而不是aaa,所以就报错了。