diadia

興味があることをやってみる。自分のメモを残しておきます。

DRFとretrofitの関係(Bodyに関して)

話したいこと

drfのrequest.dataの内容はfieldかbodyかで違いが出る話をしたい。

django rest frameworkを使ってアンドロイドからデータを受け取る場合にはrequest.dataを使う。そしてこのrequest.dataの内容がretrofitのインターフェースメソッドの記述の仕方によって変わることをメモしておく。

retrofitで@Bodyを使った場合にrequest.dataはどのように表示されるか

@POST("api/util/region/")
fun postGetRegionDataByPointAPIView(
    @Header("Authorization") authTokenHeader: String?, 
    @Body wkt_point: String
):Call<ResultRegionModel>

上記のように@Bodyを使ってdjangoに送信した場合には、以下のようにデータを受け取る。

SRID=4326;POINT (-91.51643849909306 14.84320911634316)

retrofitで@Fieldを使った場合にrequest.dataはどのように表示されるか

@FormUrlEncoded
@POST("api/util/region/")
fun postGetRegionDataByPointAPIView(
    @Header("Authorization") authTokenHeader: String?, 
    @Field("wkt_point") wkt_point: String
):Call<ResultRegionModel>

上記のように@Fieldを使ってdjangoに送信した場合のデータは以下である。

<QueryDict: {'wkt_point': ['SRID=4326;POINT (-91.50813136249779 14.84655173537646)']}>

この違いからdjangoで何が変わってくるのか?

送信されたデータの取り出し方が変わってくる。Bodyの場合にはrequest.dataでデータを受け取ることができるが、 Fieldの場合はrequest.dataがdict型なのでrequest.data["wkt_point"]を使ってデータを受けとる事ができる。