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

OkHttp使用FormBuilder发x-www-form-urlencoded POST时integer参数传递问题

核心原理说明

application/x-www-form-urlencoded 格式的请求体本身不存在原生整数类型,所有参数值都会被序列化为URL编码的字符串。服务端要求的「integer类型入参」本质是要求参数值的字符串内容为合法整数格式,服务端反序列化时会自动完成字符串到整数的类型转换,不需要额外做特殊类型标记。

你当前把整数转成字符串传入FormBuilder的写法本身是符合协议规范的,如果出现类型错误,优先检查转换后的字符串是否存在多余空格、非数字字符等格式问题。


可行解决方案

如果仍存在服务端兼容性问题,可选用以下任意一种方案处理:

  • 手动拼接参数构建RequestBody,跳过FormBuilder的默认封装
    Java示例代码:
    import java.net.URLEncoder;
    import java.nio.charset.StandardCharsets;
    import okhttp3.MediaType;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    
    // 拼接参数,整数直接转字符串即可,字符串类型参数注意做URL编码
    String paramContent = "intParam=" + 1001 + "&userName=" + URLEncoder.encode("张三", StandardCharsets.UTF_8.name());
    RequestBody requestBody = RequestBody.create(
        paramContent,
        MediaType.parse("application/x-www-form-urlencoded; charset=utf-8")
    );
    Request request = new Request.Builder()
        .url("目标API地址")
        .post(requestBody)
        .build();
    
  • 扩展FormBuilder新增整数参数重载(适用于OkHttp 4+ Kotlin环境)
    扩展方法封装:
    fun FormBody.Builder.add(name: String, value: Int): FormBody.Builder {
        return add(name, value.toString())
    }
    
    调用示例:
    val formBody = FormBody.Builder()
        .add("age", 25) // 直接传入整数即可,无需手动转字符串
        .add("nickname", "testUser")
        .build()
    

内容的提问来源于stack exchange,提问作者Gading CP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:24:03