2012-06-08 7 views
22

URL에 여러 매개 변수를 전달하는 방법을 알아 내려고합니다. 내 안드로이드 클래스에서 java 서블릿으로 위도와 경도를 전달하고 싶습니다. 어떻게해야합니까?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입니다. 이것은 작동하지만 위도와 경도를 별도의 두 매개 변수로 전달하여 서버 측의 작업량을 줄입니다. 만약 위도와 경도를 얻기 위해 tokenizer 클래스를 사용할 수 있도록 최소한 & lon 사이의 공간을 어떻게 추가 할 수 있습니까? 나는 다음 라인을 시도했지만 아무 소용이 없습니다. 다음과 같이

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

이 또한 내가 알고는 안드로이드 장치에서 서버로 데이터를 전달하기 위해이 가장 안전하고 안전한 방법입니다 싶었다.

+0

가 있어야한다'& 대신'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에 금지되어 있으므로 여기에 공백을 사용할 수는 없지만 %20 또는 +으로 인코딩 할 수는 있습니다 (그러나 이것은 더 나쁜 스타일입니다).


1 ? 경로와 매개 변수를 분리한다는 그 &는 서로 매개 변수는 이유에 대해 아무것도 설명하지 않습니다 분리합니다. 일부 RFC에서는 "거기에 &을 사용합니다"라고되어 있지만 같은 문자를 선택하지 않은 이유는 알 수 없습니다.

+0

감사의 param2', 마법처럼 일 :이

는 관련 SE 질문에서 보라. :) 당신은 또한 이것을 할 수있는 가장 안전한 방법 인 마지막 질문에 대답 해 주시겠습니까? 제가 개발중인 어플리케이션은 시장에 배포되어 보안이 보장됩니다. – 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 URL을 사용하여 StringEscapeUtils

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

의 API를 사용하여 확보 할 수 있습니다.

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

+0

URL 매개 변수를 올바르게 인코딩하는'StringEscapeUtils'에는 아무것도 표시되지 않고'URLEncoder'가 이미 있습니다. – EJP

+0

관련 SE 질문에 대한 답변이 업데이트되었습니다. –

관련 문제