如何用OkHttp创建含逗号分隔多参数的REST GET请求URL
使用OkHttp构建Google Roads API的多值参数URL
刚好我之前也用OkHttp处理过Google Roads API的请求,给你分享下具体的实现方法和注意点:
首先得明确,Google Roads API里的parameters参数是单个参数下的复合值格式,不是那种同一个参数名重复加多个值的情况(比如param=v1¶m=v2),所以OkHttp默认的多参数添加方式不适用,不过处理起来也不难,而且不用手动编码特殊字符。
方法一:手动拼接复合值,让OkHttp帮你搞定编码
OkHttp的HttpUrl.Builder在添加参数时会自动处理URL编码,所以你只需要把拼接好的原始字符串(带逗号和竖线)传进去就行,不用自己替换%2c或者%7c这种编码值。
给你写个实际的代码示例:
// 先准备你的坐标组,比如每个坐标是[纬度, 经度]的数组 List<double[]> coordinates = Arrays.asList( new double[]{37.7749, -122.4194}, new double[]{34.0522, -118.2437} ); // 拼接成value1,value2|value3,value4的格式 StringBuilder paramValue = new StringBuilder(); for (int i = 0; i < coordinates.size(); i++) { double[] coord = coordinates.get(i); paramValue.append(coord[0]).append(",").append(coord[1]); // 最后一组坐标后面不要加竖线 if (i != coordinates.size() - 1) { paramValue.append("|"); } } // 用OkHttp构建最终URL HttpUrl url = new HttpUrl.Builder() .scheme("https") .host("roads.googleapis.com") .addPathSegment("v1") .addPathSegment("nearestRoads") .addQueryParameter("parameters", paramValue.toString()) .addQueryParameter("key", "YOUR_API_KEY") .build(); // 打印出来看看,逗号和竖线都是正常显示的,因为它们属于URL安全字符 System.out.println(url.toString());
方法二:写个工具方法简化拼接
如果经常要处理这种坐标拼接,可以封装个工具方法,用Java Stream来简化代码:
private String buildCoordinatesParam(List<double[]> coords) { return coords.stream() .map(coord -> coord[0] + "," + coord[1]) .collect(Collectors.joining("|")); }
之后直接调用这个方法,把坐标列表传进去,得到的字符串直接丢给addQueryParameter就行,代码更简洁。
关于特殊字符编码的疑问
你完全不用手动处理逗号和竖线的编码:
- 根据URL规范(RFC 3986),逗号(
,)和竖线(|)属于查询参数里的安全字符,不需要编码 - 如果你的参数值里有其他特殊字符(比如空格、
&、=这些),OkHttp的addQueryParameter会自动帮你编码,不用操心
最后验证下生成的URL
最终生成的URL应该是这样的:
https://roads.googleapis.com/v1/nearestRoads?parameters=37.7749,-122.4194|34.0522,-118.2437&key=YOUR_API_KEY
这个格式完全符合Google Roads API的要求,直接调用就没问题。
内容的提问来源于stack exchange,提问作者pgman
相关产品推荐
相关产品推荐

