[Day 16] 第一主餐 pt.8-我带几个data去。你就在此地,不要走动

上一篇由於作者有点不舒服,因此用了HTTP code灌水...不是...
因此中场先讲些HTTP code的东东放松一下
今天身体好多了,那就来继续我们的主线吧
接下来我们就要来进入更进阶的request,以及介绍好用的送request用程序
废话不多说,咱们累狗~

Postman-WEB界的邮差

上一篇我们测试API是直接使用输入url的方式测试
这种测试通常都是不带data的,而且也没有指定传输方式
因此传输时的预设方式就叫做get
get method简单来说就是,这个request"通常"只会跟server要特定资料
不会去改变server内的状态或是data
对,所以我们前一篇这样写是有问题的,但由於要讲解方便,因此先用get来演示
那如果要去改变server内的data或是行为,这时候我们就要用post
post的方式通常会带一个data,这个data可能是from,可能是JSON,也可能是各种可以分辨栏位内容的东东
server接到post後就会看你post里面有啥,然後再做分门别类的处理
那还有两个PUT跟DELETE,这个我们以後再说
我们先把目光着重在GET跟POST就好

那GET的方式简单来说就是送个url就好
那POST怎麽办,总不可能为了POST写一个form吧
当然不会,因此这里就要介绍好用的API测试软件-Postman啦
这东东简单来说就是你只要
给他网址、给他data、给他method
他就会帮你执行并且接好response啦
废话不多说,我们先来下载Postman一窥究竟就知道啦
先来这边下载Postman,看你要用网页版还是OS版都可
不过我个人还是比较喜欢OS版就是
https://www.postman.com/downloads/
(下载页面应该像这样)

下载完之後执行,泡茶等他好就行
好了下载完之後打开应该长这样

这边他会问你要不要登入,不过我懒,按下下面的skip and go就好

接着我们就会进入主页面,应该会长这样

然後我们这里可以像chrome一样用新增页面的方式新增request
新增完後应该会有这个页面

我们在这里选择get
然後输入前前一篇提到的url
http://172.16.15.123:8000/stonks/clear_table/

由於是get,所以我们就不用设定输入data
好的,点下执行

可以看到回传的东东的确跟我们上一篇执行的结果一模一样

接着我们看资料库的部分
如果你嫌server要开开关关太麻烦,可以再额外开一个cmder用来查看DB
我们开启shell,看一下model内有无object
输入DBTest.objects.all()看一下table内所有资料

恩,果然没资料,看来执行的非常成功

POST request - 带球上篮

接着我们就要来修改test_api这支API变成可以接POST的模式啦
要怎麽接POST呢,非常简单
还记得我们的API function里面有参数request吗
那个就是当request发起时,传进来的参数
所以我们只要从request找参数就好
废话不多说,动工
我们在Body的页面加入这个栏位

没有啜啦,就是这麽DD

好啦,虽然我们另一边的POST接收还没写,但还是测试一下吧
将网址改成http://172.16.15.123:8000/stonks/test_api/(POST记得最後面要加/)
送出

...WHAT

好的,我们收到了403
但我们连admin都还没设定,怎会有403勒
往下一拖


...又是你,CSRF

CSRF是啥东东呢
这有点复杂,详细说明可以看维基百科
https://en.wikipedia.org/wiki/Cross-site_request_forgery
简单来说就是,每个网页都有独立的保安
你拿了一个凭证token上面会写for哪个保安的
那个token如果给别的保安,或是上面没注明给哪个保安
你就会无情的收到CSRF forbidden
那怎办呢,简单
我们先import csrf_exempt这个function
from django.views.decorators.csrf import csrf_exempt
我们就把这只API前面加个装饰function
@csrf_exempt
这样就好
就像下面的CODE这样

from django.http import JsonResponse #刚刚的JsonResponse套件
from stonks_index.models import DBTest #从models.py import DBTest 物件
from django.views.decorators.csrf import csrf_exempt
# Create your views here.
@csrf_exempt
def test_api(request):

    #建立新的DBTest object
    new_obj = DBTest()

    #把新建立的object内的test属性改成"I love Amane Kanata"
    new_obj.test = "I love Amane Kanata"

    #储存object
    new_obj.save()

    #回传200,这里使用JsonResponse,data记得回传格式为dict
    return JsonResponse(data={'msg':'add object success.'}, status=200)
    
...

再测试一次

终於成功过关啦

接下来就是改API侧啦
改之前记得执行http://172.16.15.123:8000/stonks/clear_table 清理资料

接着我们进入views.py,将api_test的code修改成如下

@csrf_exempt
def test_api(request):

    #先捞POST request body,输入应该会是一个dict
    body = request.POST

    #将body内的name取出
    name = body['name']
    
    #建立新的DBTest object
    new_obj = DBTest()

    #把新建立的object内的test属性改成"I love {POST['name']}"
    new_obj.test = "I love " + name

    #储存object
    new_obj.save()

    #回传200,这里使用JsonResponse,data回传格式为dict,将name与成功讯息结合方便察看结果
    return JsonResponse(data={'msg':name + ' add object success.'}, status=200)

注解有详细讲解每个步骤了,这里就不多加赘述啦
储存完後再用postman call一次API

成功执行
接着看table

成功加入
这样设定之後,你要在POST的name栏位加甚麽Suisei、Subaru、Rushia都可以啦(?

好的,以上就是本次的内容啦
接下来我们终於要来存点正经的东西了
我们会对Database做大幅修改
并将前面BeautifulSoup捞出来的东东存到Database里
欲知丛林会冒出甚麽激烈的火花
咱们下回分解~


<<:  【Day 12】- 找出看不见也摸不着的 Process,终极办法!

>>:  用 Line LIFF APP 实现信箱验证绑定功能(4) - 表单验证电子邮件地址

Day 27:Design Pattern in JUCE

细看 JUCE 框架的设计,可以看到一些 Design Pattern 实例。本文列出几个。 Sin...

22 | WordPress 查询回圈区块 Query Loop Block

查询回圈区块是 WordPress 5.8 新推出的功能,初步使用结论是不错的,不过部分 UI /...

Day-9 重现於新电视的音速索尼克始祖、SEGA 的 MEGA DRIVE

我想就算没玩过游戏、应该也多少听过去年上映的音速小子电影、这是部由 SEGA 游戏音速小子(现译为索...

[DAY27] 功能型团队 VS 需求型团队

前面的篇章大部分着重 DDD 的战术设计,这篇来说说战略设计。 功能型团队 在导入 DDD 前,我们...

Palo Alto Networks PSE-Strata Dumps - 让 PSE-Strata 考试成为无压力考试

PSE-Platform Professional | PSE-Strata Professiona...