web-dev-qa-db-ja.com

URLで複数のパラメーターを渡すにはどうすればよいですか?

URLで複数のパラメーターを渡す方法を見つけようとしています。 Androidクラスの緯度と経度をJavaサーブレットに渡します。どうやってやるの?

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です。これは機能していますが、サーバー側での作業が軽減されるように、緯​​度と経度を2つの別々のパラメーターで渡したいと思います。それが不可能な場合、latlonの間に少なくともスペースを追加して、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

私のサーブレットコードは次のとおりです。

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デバイスからサーバーにデータを渡す最も安全で安全な方法であることを知りたいと思いました。

31
rishiag

この

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

働かなければならない。奇妙な理由が何であれ1、最初のパラメーターの前に?が必要で、次のパラメーターの前に&が必要です。

のような複合パラメーターを使用する

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

動作しますが、確かにニースではありません。 URLで禁止されているため、スペースは使用できませんが、%20または+としてエンコードすることはできます(ただし、これはさらに悪いスタイルです)。


1 ?がパスとパラメーターを分離し、&がパラメーターを相互に分離するということは、理由については何も説明しません。一部のRFCは「あちらと使用」と言っていますが、なぜ同じ文字を選択しなかったのかわかりません。

52
maaartinus

Javaについてあまり知りませんが、URLクエリ引数は「?」ではなく「&」で区切る必要があります

http://tools.ietf.org/html/rfc3986 は、「sub-delim」をキーワードとして使用する参照に適した場所です。 http://en.wikipedia.org/wiki/Query_string も良いソースです。

3
Tõnu Samuel

複数のパラメータを「?param1=value1&param2=value2」として渡すことができます

しかし、それは安全ではありません。 Cross Site Scripting (XSS) Attackに対して脆弱です。

パラメータは、スクリプトで簡単に置き換えることができます。

これをご覧ください 記事 および 記事

StringEscapeUtils のAPIを使用して、セキュリティを強化できます。

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

上記の予防措置なしでセキュリティのためにhttps urlを使用することは、良い習慣ではありません。

関連するSEの質問をご覧ください。

RLEncoder.encode(string、 "UTF-8")は検証が不十分ですか?

2
Ravindra babu