You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:06:24