回调POST请求写入数据库

在实际工作中,我们的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,所以就报错了。

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------