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

Android Retrofit含大括号{}的URL引发错误问题求助

解决Retrofit中URL大括号冲突的问题

你遇到的问题核心在于:Retrofit会把@GET注解URL里的{}识别为路径参数占位符,但你的API URL本身包含JSON结构的{}(比如JSONUser={"mb_code":"..."}),这就导致了语法冲突——Retrofit会试图把这些JSON里的{}当成需要替换的参数,从而抛出错误。

下面给你两种可行的解决方案,推荐第一种,更符合Retrofit的最佳实践:

方案一:使用@Query拆分查询参数(推荐)

把URL中的各个查询参数(dbName、PN、JSONUser、JSONData)拆分成独立的@Query参数,让Retrofit帮你处理URL拼接和编码,完全避免大括号的冲突:

步骤1:重新定义接口方法

// baseUrl 设置为 "https://site/api/requestpost/"
@GET("gethttp")
Call<ResponseBody> downloadData(
    @Query("dbName") String dbName,
    @Query("PN") String pn,
    @Query("JSONUser") String jsonUser,
    @Query("JSONData") String jsonData
);

步骤2:调用时构建JSON参数

在调用接口前,手动构建JSONUser的字符串(也可以用Gson等序列化库生成JSON,更安全不易出错):

// 构建JSONUser字符串
String jsonUser = String.format("{\"mb_code\":\"%s\",\"pwd\":\"sj12\",\"id\":\"0000\"}", code);
// JSONData为空对象
String jsonData = "{}";

// 发起请求
Call<ResponseBody> call = apiService.downloadData("ERP", "Mobile_CustomerList_P", jsonUser, jsonData);

这种方式的优势是:

  • 避免手动拼接URL的语法错误
  • Retrofit会自动处理URL编码(比如code包含特殊字符时会自动转义)
  • 代码结构更清晰,后续维护更方便

方案二:使用@Url传入完整URL

如果你一定要直接使用完整URL,可以用@Url注解跳过Retrofit的URL解析逻辑,直接传入拼接好的完整URL:

步骤1:定义接口方法

@GET
Call<ResponseBody> downloadData(@Url String fullUrl);

步骤2:构建完整URL并调用

// 拼接完整URL
String fullUrl = baseUrl + "gethttp?dbName=ERP&PN=Mobile_CustomerList_P&JSONUser={\"mb_code\":\"" + code + "\",\"pwd\":\"sj12\",\"id\":\"0000\"}&JSONData={}";

// 发起请求
Call<ResponseBody> call = apiService.downloadData(fullUrl);

注意:这种方式需要你自己处理URL编码,如果code包含特殊字符(比如&、=等),可能会导致请求失败,所以仅在特殊场景下使用。

为什么原代码会报错?

原代码中,你在@GET的URL里混合了Retrofit的路径参数占位符({key}、{data})和JSON的{},比如JSONUser={"+ \"mb_code\":\"{key}\",\"pwd\":\"sj12\",\"id\":\"0000\"}里的}会被Retrofit误认为是路径参数占位符的结束标记,从而触发语法错误。

内容的提问来源于stack exchange,提问作者Pemba Tamang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:27:15