Java Google 路线 API
Java Google Directions API
我正在开发一个 Java Web 应用程序,它读取一个 Excel 的地址。 (学生地址)
我需要得到电子表格中一个地址到每个不同地址的距离(每个学生住的学校地址有多远)
我正在使用 Dom4J 库,并且使用两个输入(起点和终点)来检索一个距离的测试是可以的,但是当我读取 excel 文件并尝试检索每个距离时,我得到:
嵌套异常:java.io.IOException:服务器返回 HTTP 响应代码:400 URL:https://maps.google.es/maps/api/directions/xml?origin=RUA%20JOÃO%20PESSOA,%201316,%20C/03,%20Nilopolis&destination=Rua%20João%20Pessoa,Centro&key=mykey
在 java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1997)
在 java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589)
在 java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:224)
在 java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:677)
在 java.xml/com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:150)
在 java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:861)
在 java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:825)
在 java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
在 java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1224)
在 java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:637)
在 org.dom4j.io.SAXReader.read(SAXReader.java:465)
在 org.dom4j.io.SAXReader.read(SAXReader.java:291)
在 util.BibliotecaGoogle$DistanciaWS.getDocumento(BibliotecaGoogle.java:45)
在 util.BibliotecaGoogle$DistanciaWS.calcular(BibliotecaGoogle.java:24)
在 manager.Edu_turmas_impBean.determinardistancia(Edu_turmas_impBean.java:120)
在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在 java.base/java.lang.reflect.Method.invoke(Method.java:568)
在 org.apache.el.parser.AstValue.invoke(AstValue.java:246)
在 org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:266)
在 com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
在 javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
在 com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
在 org.primefaces.application.DialogActionListener.processAction(DialogActionListener.java:54)
在 javax.faces.component.UICommand.broadcast(UICommand.java:315)
在 javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
在 javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
在 com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
在 com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
在 com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
在 javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1726)
在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
在 org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
在 org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
在 java.base/java.lang.Thread.run(Thread.java:833)
这是我的代码:
public static String calcular(String origem, String destino) {
URL url;
try {
String urlformatada = "https://maps.google.es/maps/api/directions/xml?origin="
+ origem + "&destination=" + destino
+ "&key=mykey";
url = new URL(urlformatada.replace(" ", "%20"));
Document document = getDocumento(url);
return analisaXml(document);
} catch (MalformedURLException | DocumentException e) {
e.printStackTrace();
}
return "";
}
@SuppressWarnings("rawtypes")
public static String analisaXml(Document document) {
List list = document
.selectNodes("//DirectionsResponse/route/leg/distance/text");
Element element = (Element) list.get(list.size() - 1);
return element.getText();
}
public static Document getDocumento(URL url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
}
您需要完全 URL-encode origem
和 destino
参数。当您将 URL 粘贴到 Chrome 中时,它知道该做什么并对必须的内容进行编码,但 Java 库却不知道。
这样试试:
String urlformatada = "https://maps.google.es/maps/api/directions/xml?origin="
+ URLEncoder.encode( origem, "UTF-8" ) + "&destination="
+ URLEncoder.encode( destino, "UTF-8" ) + "&key=mykey";
然后删除 .replace(" ", "%20")
部分 - 这是不必要的。
感谢您的回复。问题在于,当您在浏览器上填写命令时,它会进行适当的处理,但是当您封装在代码中时,您需要处理所有内容。
例如:始发地或目的地的这些字符“ç”、“:”、“ã”。
我正在开发一个 Java Web 应用程序,它读取一个 Excel 的地址。 (学生地址)
我需要得到电子表格中一个地址到每个不同地址的距离(每个学生住的学校地址有多远)
我正在使用 Dom4J 库,并且使用两个输入(起点和终点)来检索一个距离的测试是可以的,但是当我读取 excel 文件并尝试检索每个距离时,我得到:
嵌套异常:java.io.IOException:服务器返回 HTTP 响应代码:400 URL:https://maps.google.es/maps/api/directions/xml?origin=RUA%20JOÃO%20PESSOA,%201316,%20C/03,%20Nilopolis&destination=Rua%20João%20Pessoa,Centro&key=mykey 在 java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1997) 在 java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589) 在 java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:224) 在 java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:677) 在 java.xml/com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:150) 在 java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:861) 在 java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:825) 在 java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) 在 java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1224) 在 java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:637) 在 org.dom4j.io.SAXReader.read(SAXReader.java:465) 在 org.dom4j.io.SAXReader.read(SAXReader.java:291) 在 util.BibliotecaGoogle$DistanciaWS.getDocumento(BibliotecaGoogle.java:45) 在 util.BibliotecaGoogle$DistanciaWS.calcular(BibliotecaGoogle.java:24) 在 manager.Edu_turmas_impBean.determinardistancia(Edu_turmas_impBean.java:120) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:568) 在 org.apache.el.parser.AstValue.invoke(AstValue.java:246) 在 org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:266) 在 com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 在 javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87) 在 com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 在 org.primefaces.application.DialogActionListener.processAction(DialogActionListener.java:54) 在 javax.faces.component.UICommand.broadcast(UICommand.java:315) 在 javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790) 在 javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282) 在 com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 在 com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 在 com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) 在 javax.faces.webapp.FacesServlet.service(FacesServlet.java:658) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1726) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) 在 org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.base/java.lang.Thread.run(Thread.java:833)
这是我的代码:
public static String calcular(String origem, String destino) {
URL url;
try {
String urlformatada = "https://maps.google.es/maps/api/directions/xml?origin="
+ origem + "&destination=" + destino
+ "&key=mykey";
url = new URL(urlformatada.replace(" ", "%20"));
Document document = getDocumento(url);
return analisaXml(document);
} catch (MalformedURLException | DocumentException e) {
e.printStackTrace();
}
return "";
}
@SuppressWarnings("rawtypes")
public static String analisaXml(Document document) {
List list = document
.selectNodes("//DirectionsResponse/route/leg/distance/text");
Element element = (Element) list.get(list.size() - 1);
return element.getText();
}
public static Document getDocumento(URL url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
}
您需要完全 URL-encode origem
和 destino
参数。当您将 URL 粘贴到 Chrome 中时,它知道该做什么并对必须的内容进行编码,但 Java 库却不知道。
这样试试:
String urlformatada = "https://maps.google.es/maps/api/directions/xml?origin="
+ URLEncoder.encode( origem, "UTF-8" ) + "&destination="
+ URLEncoder.encode( destino, "UTF-8" ) + "&key=mykey";
然后删除 .replace(" ", "%20")
部分 - 这是不必要的。
感谢您的回复。问题在于,当您在浏览器上填写命令时,它会进行适当的处理,但是当您封装在代码中时,您需要处理所有内容。 例如:始发地或目的地的这些字符“ç”、“:”、“ã”。