您好,登錄后才能下訂單哦!
前言
我們在django-rest-framework 自定義swagger 文章中編寫了接口, 調通了接口文檔. 接口文檔可以直接填寫參數進行請求, 接下來的問題是如何接受參數, 由于請求方式與參數序列化形式的不同, 接收參數的方式也有不同.
前提條件
服務端我們使用django-rest-framework編寫接口.
class ReturnJson(APIView): coreapi_fields=( DocParam("token"), ) def get(self, request, *args, **kwargs): return JsonResponse("Hello world!!!!!!!!++++++中文測試")
這是一個簡單接口, ReturnJson繼承自APIView
而APIView 來自from rest_framework.views import APIView
以下 def get, def post等等的前提條件都是接口類繼承自APIView.
當然還可以繼承自其它的類例如.
from rest_framework import viewsets, generics
class ReturnJson(generics.ListCreateAPIView) class ReturnJson(viewsets.ModelViewSet)
他們的用法各有特點, 詳情查看
django-rest-framework如何編寫一個接口.
class ReturnJson(APIView): coreapi_fields=( DocParam("token"), ) def get(self, request, *args, **kwargs): return JsonResponse("Hello world!!!!!!!!++++++中文測試") def post(self, request, *args, **kwargs): return JsonResponse(data={}) def put(self, request, *args, **kwargs): return JsonResponse(data={})
對一個APIView的子類, 重寫get, post, put等方法就相當于解析這個路徑的get, post, put請求,
請求對象就是request對象, http header body 的內容都被包含在request對象中.
request對象的類來自from rest_framework.request import Request
判斷對象是否是某個類實例化而來
from rest_framework.request import Request if isinstance(request, Request)
下面分別分析不同情況的參數位置和類型, 最終寫出一個方法能夠將任何類型的請求參數統一轉換為dict方便之后的邏輯編寫.
GET
get請求中參數都會以http://xxx.com/api/getjson?param1=asdf¶m2=123
這樣的形式拼接在url后面.
在request對象中
POST
post 請求參數都在請求體中, 但是其實你的url可以寫成get的形式, 最終結果, 參數會有兩部分組成, 一部分在url中, 一部分在http body 中, 但是非常不建議這樣做.
接下來的代碼編寫也不會考慮這樣的情況, post 僅考慮所有參數都在http body 中的情況.
提交類型 | 參數位置 | 參數類型 |
---|---|---|
form-data提交, | 參數在data中, | 類型為QueryDict |
application/json提交 | 參數在data中 | 類型為dict |
(swagger)使用接口文檔提交, 由于使用curl提交, 雖然是post 但是參數依然被類似get的形式拼接到了url之后, | 此時 參數在query_params 中 | 類型為 QueryDict |
x-www-form-urlencoded | 參數在data中 | 類型為 QueryDict |
PUT
提交類型 | 參數位置 | 參數類型 |
---|---|---|
form-data | request.data | QueryDict |
application/json | request.data | dict |
x-www-form-urlencoded | request.data | QueryDict |
(swagger) | request.data | dict |
PATCH
提交類型 | 參數位置 | 參數類型 |
---|---|---|
form-data | request.data | QueryDict |
application/json | request.data | dict |
x-www-form-urlencoded | request.data | QueryDict |
(swagger) | request.data | dict |
DELETE
提交類型 | 參數位置 | 參數類型 |
---|---|---|
form-data | request.data | QueryDict |
application/json | request.data | dict |
x-www-form-urlencoded | request.data | QueryDict |
(swagger) | request.query_params | QueryDict |
iOS端提交和get情況一樣 | request.query_params | QueryDict |
編寫參數統一處理的方法
總結一下, 當url有?param=1¶m=2這樣的參數時忽略body中的參數, 例如get,delete提交,如果query_params有內容, 則忽略body內容. 將QueryDict轉為dict返回, 再判斷request.data中是否有內容, 類型如何.
from django.http import QueryDict from rest_framework.request import Request def get_parameter_dic(request, *args, **kwargs): if isinstance(request, Request) == False: return {} query_params = request.query_params if isinstance(query_params, QueryDict): query_params = query_params.dict() result_data = request.data if isinstance(result_data, QueryDict): result_data = result_data.dict() if query_params != {}: return query_params else: return result_data
使用方法
class ReturnJson(APIView): coreapi_fields=( DocParam("token"), ) def get(self, request, *args, **kwargs): params=get_parameter_dic(request) return JsonResponse(data=params) def post(self, request, *args, **kwargs): params=get_parameter_dic(request) return JsonResponse(data=params) def put(self, request, *args, **kwargs): params=get_parameter_dic(request) return JsonResponse(data=params)
最后的效果
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。