source

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

factcode 2022. 9. 8. 21:48
반응형

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

Java에서 url로 이동하기 위해 쿼리 파라미터를 인코딩하려면 어떻게 해야 합니까?알아요, 이건 분명하고 이미 물어본 질문인 것 같아요.

확실하지 않은 두 가지 세부 사항이 있습니다.

  1. 공백은 URL에서 "+"로 인코딩해야 합니까, 아니면 "%20"으로 인코딩해야 합니까?크롬에서 "http://google.com/foo=?bar me"를 입력하면 크롬이 %20으로 인코딩되도록 변경됨
  2. 콜론 ":"을(를) %3B로 인코딩해야 합니까?크롬은 그렇지 않다.

주의:

  • java.net.URLEncoder.encode이치노부호화 데이터를 제출하기 위한 것 같습니다.들어 for 、 음 、 음 、 음 、 코 、 코 、 코 、 as for for for 。+%20이치노
  • java.net.URI query parameters(쿼리 를 부호화하지 않음)

java.net.URLEncoder.encode(String s, String encoding) 도와줄 수 있어요.HTML 형식 인코딩을 따릅니다.application/x-www-form-urlencoded.

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

한편, Percent-encoding(URL 인코딩이라고도 함)에서는, 다음과 같이 공간을 부호화합니다.%20이므로 콜론은 예약 문자입니다:부호화 후에도 콜론으로 남습니다.

안타깝게도 URLEncoder.encode()는 유효한 퍼센트 인코딩을 생성하지 않습니다(RFC 3986에서 규정).

URLEncoder.encode()는 공백이 "+"로 인코딩된 것을 제외하고 모든 것을 올바르게 인코딩합니다.검색된 모든 Java URI 인코더는 쿼리, 프래그먼트, 경로 부분 등을 인코딩하는 공개 메서드만 노출하고 "raw" 인코딩은 노출하지 않습니다.fragment와 쿼리는 공간을 +로 인코딩할 수 있으므로 사용하지 않습니다.경로는 올바르게 인코딩되지만 먼저 "정규화"되므로 '일반' 인코딩에도 사용할 수 없습니다.

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

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

ifreplaceAll()이치노대안은 자신의 인코더를 굴리는 것입니다.

편집: 처음에 이 코드가 "?", "&", "="로 올바르게 인코딩되지 않았습니다.

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

집::URIUtil최신 버전에서는 더 이상 사용할 수 없습니다. Java - encode URL 또는 이 스레드의 Mr. Sindi에서 더 나은 답변을 얻을 수 있습니다.


URIUtil Apache httpclient는 매우 유용하지만,

URIUtil.encodeQuery(url);

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

둘 다 올바른 맥락에서 완벽하게 유효하다.다만, 정말로 필요한 경우는, 문자열 치환을 발행할 수 있습니다.

쿼리에서 콜론을 %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");

이 문제를 해결하기 위한 다른 방법을 추가하고 싶을 뿐입니다.

프로젝트가 스프링 웹에 의존하고 있는 경우에는 스프링 웹의 활용도를 사용할 수 있습니다.

import org.springframework.web.util.UriUtils

import java.nio.charset.StandardCharsets

UriUtils.encode('vip:104534049:5', StandardCharsets.UTF_8)

출력:

vip%3A104534049%3A5

String param="2019-07-18 19:29:37";
param="%27"+param.trim().replace(" ", "%20")+"%27";

Datetime(타임 스탬프)의 경우 관찰했습니다.URLEncoder.encode(param,"UTF-8")동작하지 않습니다.

공백 문자 " "는 사용 시 + 기호로 변환됩니다.URLEncoder.encode. 이 자바 스크립트는%20에 공백 문자 암호화되어서 이 같은 다른 프로그래밍 언어들 맞은 편에 있다.로 쿼리 문자열 매개 변수에 공간+로 표시됩니다 하지만 완전히 아니라%20유효합니다.%20은 일반적으로 URI 자체의 공간을 나타내기 위해 사용됩니다(? 이전 URL 부분).

만약 당신이 url에서 유일한 공간 문제를 가지고 있습니다.나는 코드 아래 위치하고 잘 작동하기 시작하였다.

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

예:url은

www.xyz.com?para=hello정도

그리고 muUrl의 출력물이라는 겁니다.

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

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

반응형