Wie URL aufbereiten für Anfrage

y0dA

Erfahrenes Mitglied
Hi!
Im Detail geht es darum dass ein Webservice eine Anfrage an Google stellt betreffent Geokodierung der Daten, nun Frage ich mich wie diese URL am Besten aussehen sollte (immo ziemlich dumm erstellt), da ich hin und wieder eine "Connection Reset" Meldung bekomme.


Code:
	/** google key constant for http://localhost:8080/ */
	private static final String GOOGLE_KEY = 
		"ABQIAAAAU5IDceLqYFSp4k84FYLxyRTwM0brOpm-All5BF6PoaKBxRWWERSDiAIGyx-hbmMfA3v7tHF4Tvwfaw";
	
	/** first component of the google url constant */
	private static final String FIRST_COMPONENT_URL = "http://maps.google.com/maps/geo?q=";
	
	/** last component of the google url constant */
	private static final String LAST_COMPONENT_URL = "&output=xml&key=";

private String doGoogleGeocode(final String sQuery) {
		StringBuffer sb = new StringBuffer();

		try {
			/* need following format: street, [house number], zip, [locality], cc */
			URL url = new URL(GeocodeServiceImpl.FIRST_COMPONENT_URL + sQuery
					+ GeocodeServiceImpl.LAST_COMPONENT_URL
					+ GeocodeServiceImpl.GOOGLE_KEY);
		
			BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
			String inputLine;
			
			while ((inputLine = in.readLine()) != null) {
				sb.append(inputLine);
			}
			in.close();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();			
		}		
		return sb.toString();
	}

Kann man dies nicht irgendwie mittels URLConnection oder so realisieren, damit ich auch user agent bzw alle parameter "schöner" setzen kann?

Beispiel URL:
Code:
http://maps.google.com/maps/geo?q=Saagerstraße,41,4659,Edt bei Lambach,AT&output=xml&key=ABQIAAAAU5IDceLqYFSp4k84FYLxyRTwM0brOpm-All5BF6PoaKBxRWWERSDiAIGyx-hbmMfA3v7tHF4Tvwfaw

Exception:
Code:
java.net.SocketException: Connection reset
	at java.net.SocketInputStream.read(Unknown Source)
	at java.io.BufferedInputStream.fill(Unknown Source)
	at java.io.BufferedInputStream.read1(Unknown Source)
	at java.io.BufferedInputStream.read(Unknown Source)
	at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
	at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
	at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
	at java.net.URL.openStream(Unknown Source)
	at at.pcd.wam.technologie.geo.GeocodeServiceImpl.doGoogleGeocode(GeocodeServiceImpl.java:220)
	at at.pcd.wam.technologie.geo.GeocodeServiceImpl.getGeocodeAddressComplex(GeocodeServiceImpl.java:131)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.codehaus.xfire.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:59)
	at org.codehaus.xfire.service.invoker.ObjectInvoker.invoke(ObjectInvoker.java:45)
	at org.codehaus.xfire.service.binding.ServiceInvocationHandler.sendMessage(ServiceInvocationHandler.java:320)
	at org.codehaus.xfire.service.binding.ServiceInvocationHandler$1.run(ServiceInvocationHandler.java:86)
	at org.codehaus.xfire.service.binding.ServiceInvocationHandler.execute(ServiceInvocationHandler.java:134)
	at org.codehaus.xfire.service.binding.ServiceInvocationHandler.invoke(ServiceInvocationHandler.java:109)
	at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
	at org.codehaus.xfire.transport.DefaultEndpoint.onReceive(DefaultEndpoint.java:64)
	at org.codehaus.xfire.transport.AbstractChannel.receive(AbstractChannel.java:38)
	at org.codehaus.xfire.transport.http.XFireServletController.invoke(XFireServletController.java:304)
	at org.codehaus.xfire.transport.http.XFireServletController.doService(XFireServletController.java:129)
	at org.codehaus.xfire.transport.http.XFireServlet.doPost(XFireServlet.java:116)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
	at java.lang.Thread.run(Unknown Source)
 
Zuletzt bearbeitet:
Ohne eine Ahnung von sowas zu haben: Mir kommt deine URL reichlich spanisch vor ... so mit Leerzeichen drin und ß und so.

Ich würde die URL erst in einem String s speichern und dann das Erzeugen der URL wie folgt machen:

Code:
String s = GeocodeServiceImpl.FIRST_COMPONENT_URL + sQuery + GeocodeServiceImpl.LAST_COMPONENT_URL + GeocodeServiceImpl.GOOGLE_KEY;
URL url = new Url(URLEncoder.encode(s, "UTF-8"));

Wie gesagt: Keine Ahnung ob's wirklich daran liegt, aber URLs mit Leerzeichen sind immer ein bisschen komisch.
 
Hi!
Vorweg danke für die Antwort (bei manchen Themen isses hier einfach zu ruhig).

Wenn ich die URL nun so erzeuge wie do geschrieben hast bekomme ich folgende Exception :
Code:
va.net.MalformedURLException: no protocol: http%3A%2F%2Fmaps.google.com%2Fmaps%2Fgeo%3Fq%3DRaxstra%C3%9Fe%2C21%2C1100%2CWien%2CAT%26output%3Dxml%26key%3DABQIAAAAU5IDceLqYFSp4k84FYLxyRTwM0brOpm-All5BF6PoaKBxRWWERSDiAIGyx-hbmMfA3v7tHF4Tvwfaw
	at java.net.URL.<init>(Unknown Source)
	at java.net.URL.<init>(Unknown Source)
	at java.net.URL.<init>(Unknown Source)
	at at.pcd.wam.technologie.geo.GeocodeServiceImpl.doGoogleGeocode(GeocodeServiceImpl.java:187)
	at at.pcd.wam.technologie.geo.GeocodeServiceImpl.getGeocodeAddress(GeocodeServiceImpl.java:160)
	at sun.reflect.GeneratedMethodAccessor109.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.codehaus.xfire.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:59)
	at org.codehaus.xfire.service.invoker.ObjectInvoker.invoke(ObjectInvoker.java:45)
	at org.codehaus.xfire.service.binding.ServiceInvocationHandler.sendMessage(ServiceInvocationHandler.java:320)
	at org.codehaus.xfire.service.binding.ServiceInvocationHandler$1.run(ServiceInvocationHandler.java:86)
	at org.codehaus.xfire.service.binding.ServiceInvocationHandler.execute(ServiceInvocationHandler.java:134)
	at org.codehaus.xfire.service.binding.ServiceInvocationHandler.invoke(ServiceInvocationHandler.java:109)
	at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
	at org.codehaus.xfire.transport.DefaultEndpoint.onReceive(DefaultEndpoint.java:64)
	at org.codehaus.xfire.transport.AbstractChannel.receive(AbstractChannel.java:38)
	at org.codehaus.xfire.transport.http.XFireServletController.invoke(XFireServletController.java:304)
	at org.codehaus.xfire.transport.http.XFireServletController.doService(XFireServletController.java:129)
	at org.codehaus.xfire.transport.http.XFireServlet.doPost(XFireServlet.java:116)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
	at java.lang.Thread.run(Unknown Source)
 
Hast recht. So darf die URL natürlich auch nicht aussehen. Ist auch schwer so zu sagen wie die richtig sein müsste. Ich mein ich hab bisher immer nur die Werte selbst enkodiert, aber nicht die Parameternamen oder so.
Code:
URL url = new Url(GeocodeServiceImpl.FIRST_COMPONENT_URL  + URLEncoder.encode(sQuery, "UTF-8") + GeocodeServiceImpl.LAST_COMPONENT_URL + URLEncoder.encode(GeocodeServiceImpl.GOOGLE_KEY, "UTF-8"));
geht vermutlich eher in die richtige Richtung. Also es geht halt eigentlich nur darum deine unerlaubten Zeichen aus der URL rauszukriegen. Wobei man natürlich auch noch Pech haben kann und Google keine UTF8, sondern irgendeine andere Enkodierung erwarten könnte...
 
Jaa!
Nun klappt es wunderbar - vielen vielen Dank :)

Ich Depp hatte schlichtweg Sonderzeichen ausser Acht gelassen und mich ständig gefragt warum diese "dumme" Google Kodierung abkratzt (eben bei bestimmten URLs mit Leerzeichen).

mfg
 
Zurück