2012-06-08 43 views
22

我想弄清楚如何在URL中传递多个参数。我想将我的android类的经度和纬度传递给一个java servlet。我怎样才能做到这一点?如何在URL中传递多个参数?

URL url; 
double lat=touchedPoint.getLatitudeE6()/1E6; 
double lon=touchedPoint.getLongitudeE6()/1E6; 
url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+lon); 

在这种情况下,输出(写入文件)是28.53438677.472097。 这是行得通的,但我想在两个单独的参数中传递经度和纬度,这样我在服务器端的工作就减少了。如果这是不可能的,我怎么能至少增加一个lat & lon之间的空间,以便我可以使用tokenizer类来获取我的经纬度。我尝试了下面的路线,但无济于事。

url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+" "+lon); 
output- Nothing is written to file 
     url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"&?param2="+lon); 
output- 28.534386 (Only Latitude) 
     url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"?param2="+lon); 
output- 28.532577?param2=77.502996 

我的servlet代码如下:

req.setCharacterEncoding("UTF-8"); 
resp.setCharacterEncoding("UTF-8"); 
final String par1 = req.getParameter("param1"); 
final String par2 = req.getParameter("param2"); 
FileWriter fstream = new FileWriter("C:\\Users\\Hitchhiker\\Desktop\\out2.txt"); 
BufferedWriter out = new BufferedWriter(fstream); 
out.write(par1); 
out.append(par2); 
out.close(); 

此外,我想就知道这是将数据传递从Android设备到服务器的最安全和最安全的方式。

+0

应该是'&param2',而不是'param2' – xandy

回答

44

url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"&param2="+lon); 

必须工作。无论出于什么奇怪的原因,您需要在第一个参数前?&之前的以下几个。

使用复合参数一样

url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"_"+lon); 

会的工作也一样,但肯定不是很好。你不能在URL中使用空格,因为它在URL中是被禁止的,但是你可以将它编码为%20+(但这是更糟的样式)。


1,说明?路径和参数分离和&彼此分离参数并不能解释这是什么缘故任何事情。一些RFC说“在那里使用?&”,但我看不出为什么他们没有选择相同的字符。

+0

谢谢,工作就像一个魅力? :)你也可以请回答我最后一个问题,这是最安全的方式来做到这一点?我正在开发的应用程序将在市场上部署,因此它的安全性是必要的。 – rishiag

+0

关于安全性,答案肯定取决于你需要什么样的安全性。如果你想防止未经授权使用你的应用程序,你可能会失控。为了保证通信安全,“HTTPS”通常是可行的。在客户端,你只需要添加一个“s”,在服务器端你需要一个私钥和一个由CA签名的证书。或者你可以运行你自己的,这是一个更多的工作。然而......这是一个不同的问题,发布它。 – maaartinus

+3

这不是一个奇怪的原因。 '?'不是查询字符串的一部分。它只是请求URI和请求查询字符串之间的分隔符。查询字符串参数对反过来需要'&'作为分隔符。查询字符串参数名称和值对需要'='作为分隔符。查询字符串中的空格应该被编码为'+'。 '%20'只适用于请求URI部分。您可以使用'URLEncoder#encode()'来编码查询字符串组件。另见http://stackoverflow.com/questions/2793150/ – BalusC

0

您可以将多个参数为“?param1=value1&param2=value2

但它并不安全。它很容易受到Cross Site Scripting (XSS) Attack

您的参数可以简单地替换为脚本。

看一看这个articlearticle

你可以把它用即使使用https网址安全无上述措施的StringEscapeUtils

static String escapeHtml(String str) 
      Escapes the characters in a String using HTML entities. 

API安全是不是一个好的做法。

看一看相关SE问题:

Is URLEncoder.encode(string, "UTF-8") a poor validation?

+0

我没有看到任何正确编码URL参数的'StringEscapeUtils',并且'URLEncoder'已经存在。 – EJP

+0

更新回答与相关SE问题。 –