上一篇由於作者有點不舒服,因此用了HTTP code灌水...不是...
因此中場先講些HTTP code的東東放鬆一下
今天身體好多了,那就來繼續我們的主線吧
接下來我們就要來進入更進階的request,以及介紹好用的送request用程式
廢話不多說,咱們累狗~
上一篇我們測試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內所有資料
恩,果然沒資料,看來執行的非常成功
接著我們就要來修改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這個functionfrom 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裡
欲知湯
跟叢林
會冒出甚麼激烈的火花
咱們下回分解~