2012-06-08 33 views
22

Estoy tratando de averiguar cómo pasar múltiples parámetros en una URL. Quiero pasar la latitud y la longitud de mi clase de Android a un servlet Java. ¿Cómo puedo hacer eso?¿Cómo paso múltiples parámetros en la 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); 

En este caso, la salida (escrita en el archivo) es 28.53438677.472097. Esto está funcionando pero quiero pasar la latitud y la longitud en dos parámetros separados para que mi trabajo en el servidor se reduzca. Si no es posible, ¿cómo puedo al menos agregar un espacio entre lat & lon para que pueda usar la clase tokenizer para obtener mi latitud y longitud? Intenté seguir la línea, pero fue en vano.

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 

Mi código del servlet es el siguiente:

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(); 

También quería el saber es este el modo más seguro y garantizado para pasar los datos desde el dispositivo Android con el servidor.

+0

debería ser '& param2' en lugar de' param2' – xandy

Respuesta

44

Este

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

deben trabajar. Por cualquier razón extraña , necesita ? antes del primer parámetro y & antes de los siguientes.

El uso de un compuesto como parámetro

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

funcionaría, también, pero no es sin duda agradable. No puede usar un espacio allí, ya que está prohibido en una URL, pero podría codificarlo como %20 o + (pero este es aún peor estilo).


1 Indicando que ? separa la ruta y los parámetros y que separa & parámetros entre sí no explica nada acerca de la razón. Algunos RFC dicen "use? There y & allí", pero no puedo ver por qué no eligieron el mismo personaje.

+0

Gracias, funcionó como un encanto?. :) ¿Podría responder también mi última pregunta, que es la forma más segura de hacerlo? La aplicación que estoy desarrollando se implementará en el mercado, por lo que es necesario que esté segura. – rishiag

+0

En cuanto a la seguridad, la respuesta seguramente depende del tipo de seguridad que necesite. Si desea evitar el uso no autorizado de su aplicación, es posible que esté fuera de bloqueo. Para una comunicación segura, 'HTTPS' suele ser el camino a seguir. En el lado del cliente solo necesita agregar una "s", en el lado del servidor necesita una clave privada y un certificado firmado por una CA. O puede ejecutar uno propio, que es un poco más de trabajo. Sin embargo ... esta es una pregunta diferente, publícala. – maaartinus

+3

No es una razón extraña. El '?' No es parte de la cadena de consulta. Es solo el carácter separador entre el URI de solicitud y la cadena de consulta de solicitud. Los pares de parámetros de cadenas de consulta a su vez necesitan el carácter '&' como separador. El nombre del parámetro de cadena de consulta y el par de valores a su vez necesitan '' 'como carácter separador. Por cierto, los espacios en cadenas de consulta deberían codificarse como '+'. El '% 20' solo es aplicable en la parte URI de solicitud. Puede usar 'URLEncoder # encode()' para codificar componentes de cadena de consulta. Véase también http://stackoverflow.com/questions/2793150/ – BalusC

0

Puede pasar varios parámetros como "?param1=value1&param2=value2"

Pero no es seguro. Es vulnerable a Cross Site Scripting (XSS) Attack.

Su parámetro se puede reemplazar simplemente con una secuencia de comandos.

Tener un vistazo a este article y article

Puede que sea segura mediante el uso de la API de StringEscapeUtils

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

Incluso utilizando https url de seguridad sin las precauciones anteriores no es una buena práctica.

Tenga una mirada en cuestión SE relacionada:

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

+0

No veo nada en 'StringEscapeUtils' que codifique los parámetros de URL correctamente, y' URLEncoder' ya existe. – EJP

+0

Respuesta actualizada con la pregunta SE relacionada. –

Cuestiones relacionadas