Programing

자바에서 URL 쿼리 매개 변수 인코딩

lottogame 2020. 8. 25. 19:16
반응형

자바에서 URL 쿼리 매개 변수 인코딩


Java에서 URL로 이동하기 위해 쿼리 매개 변수를 어떻게 인코딩합니까? 나는 이것이 명백하고 이미 질문 한 것처럼 보인다는 것을 안다.

확실하지 않은 두 가지 미묘함이 있습니다.

  1. URL에서 공백을 "+"또는 "% 20"으로 인코딩해야합니까? 크롬에서 "http://google.com/foo=?bar me"를 입력하면 크롬이 % 20으로 인코딩되도록 변경합니다.
  2. 콜론 ":"을 % 3B로 인코딩하는 것이 필요하거나 정확합니까? Chrome은 그렇지 않습니다.

노트:

  • java.net.URLEncoder.encode작동하지 않는 것 같습니다. 데이터를 인코딩하여 양식을 제출하는 것 같습니다. 예를 들어, +대신 공백을 %20인코딩하고 필요하지 않은 콜론을 인코딩합니다.
  • java.net.URI 쿼리 매개 변수를 인코딩하지 않음

java.net.URLEncoder.encode(String s, String encoding)너무 도움이 될 수 있습니다. HTML 형식 인코딩을 따릅니다 application/x-www-form-urlencoded.

URLEncoder.encode(query, "UTF-8");

반면, 백분율 인코딩 ( URL 인코딩 이라고도 함 )은 %20. 콜론은 예약 된 문자이므로 :인코딩 후에도 여전히 콜론으로 유지됩니다.


편집 : URIUtil더 이상 최신 버전에서 더 이상 사용할 수 없으며 Java 에서 더 나은 대답 - 이 스레드의 URL 인코딩 또는 Mr.


URIUtilApache httpclient의 몇 가지 대안 이 있지만 정말 유용합니다.

URIUtil.encodeQuery(url);

예를 들어 공백을 "% 20"대신 "+"로 인코딩합니다.

둘 다 올바른 컨텍스트에서 완벽하게 유효합니다 . 정말로 선호한다면 문자열 교체를 발행 할 수 있습니다.


불행히도 URLEncoder.encode ()는 유효한 백분율 인코딩을 생성하지 않습니다 ( http://tools.ietf.org/html/rfc3986#section-2.1에 지정된대로 ).

URLEncoder.encode ()는 공백이 "+"로 인코딩되는 것을 제외하고 모든 것을 잘 인코딩합니다. 내가 찾을 수있는 모든 Java URI 인코더는 쿼리, 조각, 경로 부분 등을 인코딩하는 공용 메서드 만 노출하지만 "원시"인코딩은 노출하지 않습니다. 조각과 쿼리가 공간을 +로 인코딩 할 수 있기 때문에 유감스럽게도 사용하고 싶지 않습니다. 경로가 올바르게 인코딩되었지만 먼저 "정규화"되어 있으므로 '일반'인코딩에도 사용할 수 없습니다.

내가 생각 해낼 수있는 최고의 솔루션 :

return URLEncoder.encode(raw, "UTF-8").replaceAll("\\+", "%20");

경우 replaceAll()당신을 위해 너무 느립니다, 나는 대안은 자신의 인코더를 출시 할 것 같아요 ...

편집 : "?", "&", "="를 올바르게 인코딩하지 않는이 코드를 여기에 먼저 넣었습니다.

//don't use - doesn't properly encode "?", "&", "="
new URI(null, null, null, raw, null).toString().substring(1);

쿼리에서 콜론을 % 3B로 인코딩 할 필요는 없지만 불법은 아닙니다.

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

또한 공간이 ALPHA 또는 DIGIT인지 의심하기 때문에 백분율로 인코딩 된 공간 만 유효한 것으로 보입니다.

에 보이는 URI를 사양 자세한 내용은.


내장 된 Java URLEncoder는 예상되는 작업을 수행하므로 사용해야합니다.

"+"또는 "% 20"은 둘 다 URL의 공백 문자에 대한 유효한 대체입니다. 둘 중 하나가 작동합니다.

":" 구분 문자이므로 인코딩 되어야 합니다. http : // foo 또는 ftp : // bar . 특정 브라우저가 인코딩되지 않은 경우 처리 할 수 ​​있다는 사실은 정확하지 않습니다. 인코딩해야합니다.

좋은 방법으로 문자 인코딩 매개 변수를 사용하는 방법을 사용해야합니다. UTF-8이 일반적으로 사용되지만 명시 적으로 제공해야합니다.

URLEncoder.encode(yourUrl, "UTF-8");

URL에 공간 문제 만있는 경우. 나는 아래 코드를 사용했으며 잘 작동합니다.

String url;
URL myUrl = new URL(url.replace(" ","%20"));

예 : URL은

www.xyz.com?para= 안녕하세요 선생님

그러면 muUrl의 출력은 다음과 같습니다.

www.xyz.com?para=hello%20sir

참고 URL : https://stackoverflow.com/questions/5330104/encoding-url-query-parameters-in-java

반응형