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"]を使ってデータを受けとる事ができる。