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 origemdestino 参数。当您将 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") 部分 - 这是不必要的。

感谢您的回复。问题在于,当您在浏览器上填写命令时,它会进行适当的处​​理,但是当您封装在代码中时,您需要处理所有内容。 例如:始发地或目的地的这些字符“ç”、“:”、“ã”。