Java에서 URL 쿼리 매개 변수 인코딩
Java에서 url로 이동하기 위해 쿼리 파라미터를 인코딩하려면 어떻게 해야 합니까?알아요, 이건 분명하고 이미 물어본 질문인 것 같아요.
확실하지 않은 두 가지 세부 사항이 있습니다.
- 공백은 URL에서 "+"로 인코딩해야 합니까, 아니면 "%20"으로 인코딩해야 합니까?크롬에서 "http://google.com/foo=?bar me"를 입력하면 크롬이 %20으로 인코딩되도록 변경됨
- 콜론 ":"을(를) %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
'source' 카테고리의 다른 글
플랫 파일 데이터베이스 (0) | 2022.09.08 |
---|---|
MySQL vs MySQLi(PHP 사용 시) (0) | 2022.09.08 |
virtualenv 문제 - 활성화할 수 없음 (0) | 2022.09.08 |
N초를 datetime에 추가하는 표준 방법은 무엇입니까?Python에서 시간? (0) | 2022.09.08 |
VueJ가 vue 구성 요소의 외부 Import 메서드에 액세스합니다. (0) | 2022.09.08 |