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
相关产品推荐
相关产品推荐

