URL은 어디에나 있지만 개발자는 스택 오버 플로우에서 URL을 올바르게 만드는 방법을 묻는 사람들을 종종보고 있기 때문에 개발자는 실제로 이해하지 못하는 것 같습니다. URL 구문의 작동 방식을 알고 싶다면 Lunatech 의이 기사를 읽을 수 있습니다.
이 기사에서는 URL의 전체 구문을 깊이 소개하지 않습니다 (URL을 완전히 이해하려면 RFC 3986, RFC 1738 및 위에서 언급 한 기사 및 W3 위의 문서를 읽을 수 있습니다). 여기서는 URL을 작동하는 일부 일반적인 라이브러리와 URL 빌더를 통해 올바르게 사용하는 방법에 대해 이야기하고 싶습니다. URL을 올바르게 만들기 위해 게시 한 Java 라이브러리입니다.
질문 1 : Java의 Urlencoder
이 클래스는 나쁘게 지명 될뿐만 아니라 문서의 첫 문장은 그다지 정확하지 않습니다.
HTML 양식 인코딩의 유틸리티 클래스.
왜 그것이 Urlencoder라고 불리는 지 궁금 할 수도 있지만,이 줄을 볼 때는 완전히 말이 없습니다.
Lunatech 블로그 게시물을 읽은 경우 이제이 클래스를 통해 URL 문자열을 안전하고 올바르게 인코딩 된 URL 객체로 기적적으로 변환 할 수 없다는 것을 이해해야합니다. 물론, 당신이 충분한 숙제를하지 않았다면, 당신이 이해하는 데 도움이되는 작은 예가 있습니다.
쿼리 매개 변수 p를 수락하는 HTTP 서비스 엔드 포인트 http://foo.com/search가 있다고 가정 해보며 p의 값은 검색 할 문자열입니다. 문자열 "You & I"를 검색하는 경우 처음으로 만든 검색의 URL은 다음과 같습니다. http://foo.com/search?q=you & I는 물론 쿼리 매개 변수 이름/값 쌍을 분리하는 분리기이기 때문에 작동하지 않습니다. 이 지저분한 URL 문자열을 얻는다면, 먼저 무력감이 있기 때문에 올바르게 구문 분석 할 수 없기 때문입니다.
좋아, urlencoder를 사용합시다. urlencoder.encode ( "You & I", "UTF-8")는+%26+i의 결과입니다. 이 %26을 디코딩 한 후에는 & 및 + 부호가 쿼리 문자열의 공백을 나타내 므로이 URL은 정상적으로 작동 할 수 있습니다.
이제 쿼리 문자열을 사용하여 URL 경로를 URL 매개 변수에 넣는 대신 URL 경로를 분류한다고 가정 해 봅시다. 분명히, http://foo.com/search/you & 나는 틀렸다. 불행히도 urlencoder.encode ()의 결과도 잘못되었습니다. http://foo.com/search/you+%26+i는+부호가 URL 경로의 공간으로 해결되지 않기 때문에/search/you+&+i를 얻습니다.
Urlencoder는 일부 시나리오를 만족시킬 수 있습니다. 불행히도 지나치게 일반적인 이름으로 개발자가 쉽게 오용 할 수 있습니다. 따라서 가장 좋은 방법은 사용하지 않기 때문에 다른 개발자가 귀하의 기반으로 다른 기능을 사용할 때 실수를 저지르도록합니다 (실제로 "HTML Form 인코딩"을 수행하지 않는 한).
질문 2 : Groovy httpbuilder 및 Java 's Uri
HTTP Builder는 Groovy의 HTTP 클라이언트 라이브러리입니다.
일반적인 GET 요청을 만드는 것은 매우 간단합니다.
new httpBuilder ( "http : // localhost : 18080") .request (method.get) {uri.path = "/foo"}이 코드는 get /foo http /1.1을 서버로 보냅니다 (NC -L -P 18080을 실행 한 다음이 코드를 실행하여 확인할 수 있습니다).
공백이 포함 된 URL을 시도해 봅시다.
New HttpBuilder ( "http : // localhost : 18080") .request (method.get) {uri.path = "/foo bar"}이것은 get /foo%20bar http /1.1을 보냅니다.
이제 우리 경로에는 foo/bar라는 섹션이 있다고 가정하십시오. 이것은 Foo/Bar를 보내는 것만으로는 간단히 수행 할 수 없습니다. 이것은 경로, foo 및 bar에서 두 개의 세그먼트로 간주되기 때문입니다. foo%2fbar를 시도해 봅시다 (해당 인코딩으로 / 교체).
new httpBuilder ( 'http : // localhost : 18080') .request (method.get) {uri.path = '/foo%2fbar'}이것은 get /foo%252fbar http /1.1을 보냅니다. 이것은별로 좋지 않습니다. %2F의 %는 반복적으로 인코딩되므로 디코딩 후 얻은 경로는 foo/bar 대신 foo %2fbar입니다. 여기서 비난해야 할 진짜는 java.net.uri입니다. httpbuilder의 uribuilder 클래스가 그것을 사용하기 때문입니다.
위의 코드의 구성 마감에 노출 된 URI 속성의 유형은 Uribuilder입니다. URI.Path =…를 통해 URI의 경로 속성을 업데이트하면 결국 URI의 생성자를 호출합니다. 이 방법은 다음과 같이 들어오는 경로 속성을 설명합니다.
경로 매개 변수가 제공되면 URL에 추가됩니다. 경로의 문자는 보존되지 않은, 구두점, 탈출 및 기타 카테고리가없는 한 인코딩됩니다 (번역기 주 :이 범주는 RFC 2396에 자세히 설명되어 있음).
인코딩 전 텍스트에 특수 문자가 포함되어 있으면 올바르게 인코딩 된 경로 세그먼트를 생성 할 수 없기 때문에이 접근법은 의미가 없습니다. 다시 말해, "나는이 문자열을 인코딩하고 인코딩 한 후에는 정확하다"고 말했다. 물론 오류 인 Uri는이 오류의 희생자가된다. 문자열이 올바르게 인코딩 된 경우 문제가 없습니다. 그렇지 않은 경우 문자열을 구문 분석 할 수 없기 때문에 수행됩니다. 실제로, 문서에서 말하는 것은 /를 피하지 못한다는 것은 경로 문자열이 올바르게 인코딩되었다고 가정한다는 것을 의미합니다 (즉, 경로를 분리하는 데 올바르게 사용됨). 올바르게 인코딩되지 않았다 (다른 부분은 인코딩되어야한다).
httpbuilder가 URI 클래스 의이 결함 기능을 사용하지 않으면 좋을 것입니다. 물론 URI 자체가 괜찮다면 더 나을 것입니다.
올바른 방법
우리는이 URL 빌더를 썼는데, 이는 개발자가 다양한 유형의 URL을 쉽게 스플릿 할 수 있도록 도와줍니다. 기사의 시작시 참조 자료의 인코딩 사양을 따릅니다. 또한 스트리밍 API를 제공합니다. 다음 사용 예제는 거의 모든 사용 시나리오를 다룰 수 있습니다.
urlBuilder.forHost ( "http", "foo.com") .tourlstring ()
결과는 다음과 같습니다. http://foo.com/with%20spaces/path/with/varargs/&=%3f%2F; mattix=param%3f?fancy%20%2B%20Name=Fancy?%3DValue#%23?=
이 예제는 URL의 각 부분에 대해 다른 인코딩 규칙을 보여줍니다. 예를 들어, 경로에서 인코딩되지 않은 & =는 허용되지만?/는?/를 인코딩해야하지만 = 쿼리 매개 변수에서 인코딩해야하지만? 숫자는 이미 쿼리 문자열의 일부이기 때문에 필요하지 않습니다 (번역기 주 : 쿼리 문자열은 숫자로 시작하므로 나중에 숫자를 포함 할 수 있습니다).
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!