如何通过Retrofit规范实现该Paytm POST网络请求调用
问题说明
你当前编写的Retrofit接口和原有可正常运行的HttpURLConnection请求逻辑不匹配,核心错误有两处:
- 错误使用
@FormUrlEncoded+@Field注解组合:该组合会自动将请求体编码为application/x-www-form-urlencoded的表单格式,但原请求明确要求Content-Type: application/json,是直接将完整JSON字符串写入请求体,不存在表单编码逻辑。 - 传参规则不符合原请求逻辑:原请求的POST Body是
AnyJSONObject.toString()生成的完整JSON字符串,不是名为extraParamsMap的单个表单字段。
正确实现方案
1. 初始化Retrofit实例
将Paytm接口的固定路径前缀设为baseUrl,添加JSON序列化转换器支持:
val paytmRetrofit = Retrofit.Builder() .baseUrl("https://securegw.paytm.in/theia/api/v1/") .addConverterFactory(GsonConverterFactory.create()) .build() val paytmApi = paytmRetrofit.create(PaytmApiService::class.java)
如果你需要直接传递原始JSON字符串而非实体类,可以替换为ScalarsConverterFactory,自行引入对应依赖即可。
2. 定义API接口
移除错误的@FormUrlEncoded与@Field注解,使用@Body传递JSON请求体,明确声明请求头:
interface PaytmApiService { @Headers("Content-Type: application/json", "Accept: application/json") @POST("initiateTransaction") suspend fun initiateTransaction( @Query("mid") mid: String, @Query("orderId") orderId: String, @Body requestBody: RequestBody ): JsonObject }
如果不想手动构造RequestBody,也可以直接将@Body的参数类型设为你构造请求参数用的JsonObject、自定义数据类,Gson转换器会自动完成JSON序列化。
3. 发起请求
在协程作用域内调用接口即可,请求体构造逻辑和原代码完全对齐:
// 构造请求参数,内容和原代码中的AnyJSONObject完全一致 val requestJson = JSONObject().apply { // 放入所有业务参数,比如原逻辑里的extraParamsMap等字段 put("extraParamsMap", yourExtraParams) }.toString() // 构造JSON格式的请求体 val requestBody = RequestBody.create( "application/json".toMediaTypeOrNull(), requestJson ) // 发起请求 val response = paytmApi.initiateTransaction( mid = merchantId, orderId = orderId, requestBody = requestBody ) // 后续处理响应的逻辑和原onResponse逻辑完全一致即可
注意:mid和orderId会自动拼接在URL后面,和原HttpURLConnection拼接的URL参数完全一致,不需要手动处理。
内容的提问来源于stack exchange,提问作者Gulab Sagevadiya
相关产品推荐
相关产品推荐

