django-rest-framework解析請求參數

django-rest-framework解析請求參數

前言

前面的文章中編寫了接口, 調通了接口文檔. 接口文檔能夠直接填寫參數進行請求, 接下來的問題是如何接受參數, 因爲請求方式與參數序列化形式的不一樣, 接收參數的方式也有不一樣.python

前提條件

服務端咱們使用django-rest-framework編寫接口.django

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 APIViewjson

如下 def get, def post等等的前提條件都是接口類繼承自APIView.
固然還能夠繼承自其它的類例如.api

from rest_framework import viewsets, generics

class ReturnJson(generics.ListCreateAPIView)
class ReturnJson(viewsets.ModelViewSet)

 

他們的用法各有特色, 詳情查看
        http://www.django-rest-framework.org/api-guide/viewsets/
        http://www.django-rest-framework.org/api-guide/generic-views/
        http://www.django-rest-framework.org/api-guide/views/ruby

django-rest-framework如何編寫一個接口.

 

對一個APIView的子類, 重寫get, post, put等方法就至關於解析這個路徑的get, post, put請求,
請求對象就是request對象, http header body 的內容都被包含在request對象中.
request對象的類來自from rest_framework.request import Request
判斷對象是不是某個類實例化而來app

from rest_framework.request import Request
if isinstance(request, Request)

 

下面分別分析不一樣狀況的參數位置和類型, 最終寫出一個方法可以將任何類型的請求參數統一轉換爲dict方便以後的邏輯編寫.

GET

get請求中參數都會以http://xxx.com/api/getjson?param1=asdf&param2=123
這樣的形式拼接在url後面.
在request對象中
request.query_params 中能夠獲取?param1=32&param2=23形式的參數.
request.query_params 返回的數據類型爲QueryDict
QueryDict轉爲普通python字典. query_params.dict()便可.curl

POST

post 請求參數都在請求體中, 可是其實你的url能夠寫成get的形式, 最終結果, 參數會有兩部分組成, 一部分在url中, 一部分在http body 中, 可是很是不建議這樣作.
接下來的代碼編寫也不會考慮這樣的狀況, post 僅考慮全部參數都在http body 中的狀況.ide

提交類型 參數位置 參數類型
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&param=2這樣的參數時忽略body中的參數, 例如get,delete提交,若是query_params有內容, 則忽略body內容. 將QueryDict轉爲dict返回, 再判斷request.data中是否有內容, 類型如何.post

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)

 

 

 
相關文章
相關標籤/搜索