Java 为什么可以';谷歌地图静态API处理我的编码URI吗?

Java 为什么可以';谷歌地图静态API处理我的编码URI吗?,java,google-maps,Java,Google Maps,我正在尝试使用GoogleMaps静态API将一些GoogleMaps位集成到我的Java web应用程序中。现在我只是想弄张地图,随便什么地图。他们的例子是: http://maps.google.com/maps/api/staticmap?center=40.714728,-73.998672&zoom=12&size=400x400&sensor=false 在我的浏览器中运行良好。但是,我使用的Java HTTP客户端软件(Apache HTTP组件版本4.0

我正在尝试使用GoogleMaps静态API将一些GoogleMaps位集成到我的Java web应用程序中。现在我只是想弄张地图,随便什么地图。他们的例子是:

http://maps.google.com/maps/api/staticmap?center=40.714728,-73.998672&zoom=12&size=400x400&sensor=false
在我的浏览器中运行良好。但是,我使用的Java HTTP客户端软件(Apache HTTP组件版本4.0.2中的一个)坚持要求我对URI进行编码,因此我最终得出以下结论:

http://maps.google.com/maps/api/staticmap?center%3D40.714728%2C-73.998672%26zoom%3D12%26size%3D400x400%26sensor%3Dfalse
这不管用。我很乐意不编码我的URI,但如果我不编码,Apache客户端就会失败。所以我的问题是,我怎样才能:

  • 说服Apache的客户端使用普通URI或
  • 将编码的URI转换为Google将接受的格式

?仅对URI的参数进行编码。您的第一个
,然后您的
=
&
不应进行URI编码

您的URI应该是

http://maps.google.com/maps/api/staticmap?center=40.714728%2C-73.998672&zoom=12&size=400x400&sensor=false

唯一的URI编码字符是
%2C
,坐标之间的

正如Pekka建议的那样,您需要保留
&
=
未编码

您的编码url

http://maps.google.com/maps/api/staticmap?center%3D40.714728%2C-73.998672%26zoom%3D12%26size%3D400x400%26sensor%3Dfalse
vs未编码的
&
%26
)和
=
%3D
)(工作)

Apache的HTTPComponents HTTP客户端有许多接口,您可以使用这些接口构建请求URL。为了确保URL的正确部分被编码,我建议使用以下方法:

List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("center", "40.714728,-73.998672"));
qparams.add(new BasicNameValuePair("zoom", "12"));
qparams.add(new BasicNameValuePair("size", "400x400"));
qparams.add(new BasicNameValuePair("sensor", "false"));
URI uri = URIUtils.createURI("http", "maps.google.com", -1, "/maps/api/staticmap", 
    URLEncodedUtils.format(qparams, "UTF-8"), null);
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());
List qparams=new ArrayList();
qparams.add(新的BasicNameValuePair(“中心”,“40.714728,-73.998672”);
添加(新的BasicNameValuePair(“缩放”、“12”);
添加(新的BasicNameValuePair(“尺寸”,“400x400”);
添加(新的BasicNameValuePair(“传感器”、“假”);
URI=URIUtils.createURI(“http”、“maps.google.com”、-1、“/maps/api/staticmap”,
URLEncodedUtils.format(qparams,“UTF-8”),null;
HttpGet HttpGet=新的HttpGet(uri);
System.out.println(httpget.getURI());
  • 更多示例
  • API文档

  • 您需要编码URI组件,而不是整个组件。
    &
    =
    字符需要保持未编码状态。只需简单的规则,始终对参数名称和值进行编码。adamse给出了一个很好的例子。我不明白的是:为什么Google不支持必要的
    &
    &在其url中?将带有
    的标记标记为无效。
    
    List<NameValuePair> qparams = new ArrayList<NameValuePair>();
    qparams.add(new BasicNameValuePair("center", "40.714728,-73.998672"));
    qparams.add(new BasicNameValuePair("zoom", "12"));
    qparams.add(new BasicNameValuePair("size", "400x400"));
    qparams.add(new BasicNameValuePair("sensor", "false"));
    URI uri = URIUtils.createURI("http", "maps.google.com", -1, "/maps/api/staticmap", 
        URLEncodedUtils.format(qparams, "UTF-8"), null);
    HttpGet httpget = new HttpGet(uri);
    System.out.println(httpget.getURI());