Retrofit2系列之使用form-data发送数据

项目中遇上了服务器请求 form-data 发现写法有很多,这里我仅仅是用来发送键值对,并没有发送文件。并且使用的是okHttp4 其中RequestBody创建方式与原来okHttp3中略有不同。

第零种方式
 @FormUrlEncoded
 @POST("/breathingMask/android/v1/employee/login")
 suspend fun login(@Field("phone")phone:String, @Field("password")password:String):Response<LoginDto>
第一种方式

使用 MultipartBody 创建RequestBody。实际上MultipartBody 继承了RequestBody扩展,专门用来发送form数据的。这个时候就不用使用 @Multipart 来注解了。

api部分

 @POST("/plant/showData.php")
 fun getPant(@Body requestBody: RequestBody): Call<Any>// 可以换成RxJava的Observable

使用,假设已经创建对应api

val requestBody: RequestBody = MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("action", "getPlant")
            .build()
        val call = api.getPant(requestBody)
        call.enqueue(/*省略回调*/)

这种方式呢,在api接口中不用配置那么复杂,所有键值对可以通过addFormDataPart方法来添加。

第二种方式@Multipart + @Part

api部分,每个@part对应一个键值对,这里我的键名是action(后台给的我也没办法)

@Multipart
@POST("/plant/showData.php")
fun getProcess(@Part("action") requestBody: RequestBody):Call<Any>

使用方式,顺便用用coroutines

//关键body的创建方式,getProcess是要发送的值,这是okHttp4种RequestBody的创建方式
val body = "getProcess".toRequestBody("text/plain".toMediaType())
//下面是用来异步发送请求的,可以用你喜欢的异步方式
	launch {
		var response: Response<Any>? = null
        withContext(Dispatchers.IO) {
        	response = api.getProcess(body).execute()
        }
        Log.d(TAG, response!!.body().toString())
   }
第三种方式 @Multipart + @PartMap

这种方式和上面那个一样,只不过如果键值对太多,就需要使用多个@Part那还不如传递个Map进去呢。
api部分,注意Map最好选择MutableMap,否则会有异常出现。

  @Multipart
  @POST("/plant/showData.php")
  fun getProcess(@PartMap requestMap: MutableMap<String, RequestBody>): Call<Any>

使用方式

val body = "getProcess".toRequestBody("text/plain".toMediaType())
val requestMap = mutableMapOf<String, RequestBody>()
requestMap["action"] = body

launch {
	val deferred = async(Dispatchers.IO){
    	api.getProcess(requestMap).execute()
    }
    val response: Response<Any>?  =  deferred.await()
    Log.d(TAG, response!!.body().toString())
 }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值