작사: Joe Attardi✏️
URL은 모든 웹 앱에서 중요한 부분입니다. 앱이 API에 요청하는 경우 이러한 요청에 대한 올바른 URL을 만드는 것이 중요합니다. 모든 최신 브라우저에서 지원되는 URL API는 URL을 구문 분석하고 조작하는 방법을 제공합니다. URL의 다양한 부분에 쉽게 액세스할 수 있습니다.
다음 URL을 고려해보세요.
https://example.com/api/search?query=foo&sort=asc#results
이 URL은 다음 구성 요소로 구성됩니다.
최신 JavaScript를 사용하면 URL을 구문 분석하고 필요에 따라 이러한 다양한 부분을 추출할 수 있습니다.
URL API가 제공되기 전에는 이전 브라우저에서 개발자가 URL을 구문 분석하는 한 가지 방법은 요소. 이 요소는 몇 가지 기본적인 URL 구문 분석을 제공합니다. 예를 들어, URL에서 쿼리 문자열을 추출할 수 있는 방법은 다음과 같습니다.
function getQueryString(url) { const link = document.createElement('a'); link.href = url; return url.search; }
그러나 이 접근 방식에는 몇 가지 단점이 있습니다.
정규 표현식을 사용하여 URL의 다양한 부분을 구문 분석할 수도 있지만 이는 지루하고 오류가 발생하기 쉽습니다.
URL API를 사용하여 URL을 구문 분석하는 것은 간단합니다. 구문 분석하려는 URL을 URL 생성자에 전달하기만 하면 됩니다. URL 문자열이 유효하면 URL의 다양한 부분에 대한 속성이 포함된 URL 개체를 다시 받게 됩니다.
const url = new URL('https://example.com/api/search?query=foobar'); console.log(url.host); // example.com console.log(url.pathname); // /api/search console.log(url.search); // ?query=foobar
다음 두 가지 방법으로 URL의 쿼리 문자열에 액세스할 수 있습니다.
쿼리 문자열의 특정 매개변수 값에 관심이 있는 경우 해당 get 메소드를 사용하여 해당 이름으로 매개변수를 가져올 수 있습니다.
const url = new URL('https://example.com/api/search?query=foobar&maxResults=10'); console.log(url.searchParams.get('query'); // foobar console.log(url.searchParams.get('maxResults'); // 10
동일한 이름을 가진 매개변수가 여러 개 있는 경우 getAll을 사용하여 해당 이름에 대한 모든 값을 포함하는 배열을 가져올 수 있습니다.
const url = new URL('https://example.com/api/search?tag=tag1&tag=tag2&tag=tag3'); console.log(url.searchParams.getAll('tag')); // ['tag1', 'tag2', 'tag3']
쿼리 문자열을 직접 작성하는 것은 까다로울 수 있으며, 특히 쿼리 매개변수에 이스케이프해야 하는 특수 문자가 포함되어 있는 경우 더욱 그렇습니다. 예를 들어 쿼리 매개변수에 & 문자가 포함되어야 하는 경우 이를 &로 인코딩해야 합니다. 이러한 상황을 처리하려면 encodeURIComponent 함수를 사용해야 합니다.
function getQueryString(url) { const link = document.createElement('a'); link.href = url; return url.search; }
URLSearchParams 개체를 사용하면 쿼리 문자열을 더욱 안전하게 작성할 수 있습니다.
const url = new URL('https://example.com/api/search?query=foobar'); console.log(url.host); // example.com console.log(url.pathname); // /api/search console.log(url.search); // ?query=foobar
URLSearchParams 사용의 장점은 다음과 같습니다.
URLSearchParams 개체가 없으면 쿼리 문자열의 매개변수를 반복하는 것이 약간 까다롭습니다. 문자열을 여러 번 분할해야 합니다. 먼저 키/값 쌍 그룹으로 분할한 다음 다시 키와 값을 분할해야 합니다.
const url = new URL('https://example.com/api/search?query=foobar&maxResults=10'); console.log(url.searchParams.get('query'); // foobar console.log(url.searchParams.get('maxResults'); // 10
매개변수에 인코딩된 문자가 포함될 수 있는 경우 이를 디코딩해야 합니다.
const url = new URL('https://example.com/api/search?tag=tag1&tag=tag2&tag=tag3'); console.log(url.searchParams.getAll('tag')); // ['tag1', 'tag2', 'tag3']
대신 URLSearchParams의 항목 메소드를 사용하여 키/값 쌍을 반복할 수 있습니다.
let queryString = 'foo=bar'; queryString += '&baz=qux'; queryString += '&tag=' + encodeURIComponent('one&two'); console.log(queryString); // foo=bar&baz=qux&tag=one%26two
다음은 기본 URL과 일부 쿼리 매개변수를 사용하여 URL을 구축하는 전체 예입니다.
const params = new URLSearchParams(); params.append('foo', 'bar'); params.append('baz', 'qux'); params.append('tag', 'one&two'); console.log(params.toString()); // foo=bar&baz=qux&tag=one%26two
정규식을 사용하여 URL의 유효성을 검사할 수도 있지만 유효한 URL 문자열을 완전히 캡처하는 정규식을 만드는 것은 매우 어렵습니다.
대신 URL API에 접근할 수 있습니다. URL 생성자에 잘못된 URL을 제공하면 오류가 발생합니다. 이를 사용하여 URL이 유효한지 확인할 수 있습니다.
function listQueryParams(queryString) { queryString.split('&').forEach(param => { const [key, value] = param.split('='); console.log(`${key}: ${value}`); }); }
최신 브라우저를 사용하면 이 작업이 더욱 쉬워집니다. 한 줄의 코드로 유사한 유효성 검사를 수행하는 최신 URL.canParse 정적 메서드가 있습니다. 위의 isValidURL 함수와 마찬가지로 잠재적인 URL 문자열을 사용하고 URL 문자열의 유효성에 따라 true 또는 false를 반환합니다.
URL API에는 상대 URL을 확인하는 강력한 메커니즘이 있습니다. 일반적으로 URL 생성자에 대한 인수는 완전하고 유효한 URL이 아닌 경우 오류를 발생시킵니다. 그러나 상대 URL을 작성하기 위한 기반으로 사용되는 두 번째 인수를 지정할 수 있습니다. 두 인수 접근 방식을 사용하는 경우 첫 번째 인수는 유효한 URL일 필요는 없지만 두 번째 인수는 유효합니다.
먼저 간단한 사례를 살펴보겠습니다.
function listQueryParams(queryString) { queryString.split('&').forEach(param => { const [key, value] = param.split('='); console.log(`${key}: ${decodeURIComponent(value)}`); }); }
URL 생성자는 https://example.com의 기본 URL을 사용하고 상대 경로 /about을 추가하여 https://example.com/about을 생성합니다.
이것은 어떻습니까:
function listQueryParams(queryString) { const params = new URLSearchParams(queryString); params.entries().forEach(([key, value]) => console.log(`${key}: ${value}`)); }
https://example.com/users/profile이라고 예상할 수도 있지만 실제로는 https://example.com/profile로 나옵니다. 이는 상대 링크처럼 동작합니다. example.com의 루트인 상위 경로 세그먼트를 가져온 다음 프로필을 추가합니다.
상대 URL을 사용하는 예를 하나 더 살펴보겠습니다. ..를 사용하여 경로 계층 구조를 다시 돌아갈 수도 있습니다:
function getQueryString(url) { const link = document.createElement('a'); link.href = url; return url.search; }
https://example.com/profile에 나오는 내용입니다. 상대 URL은 상위 경로 세그먼트에서 시작된다는 점을 기억하세요. 그런 다음 여기에는 ..이 포함되어 하나 이상의 경로 세그먼트로 올라갑니다.
상대 URL로 URL 생성자를 호출하고 기본 URL에 유효하지 않거나 불완전한 URL을 지정하면 오류가 발생합니다. 전체 기본 URL 없이 상대 URL을 사용하는 경우에도 오류가 발생합니다.
const url = new URL('https://example.com/api/search?query=foobar'); console.log(url.host); // example.com console.log(url.pathname); // /api/search console.log(url.search); // ?query=foobar
현재 페이지의 URL을 나타내는 window.location 개체에 대해 잘 알고 계실 것입니다. 이 객체에는 href 및 pathname과 같은 속성도 있으므로 URL 객체라고 생각할 수 있습니다. 이는 URL과 공통된 일부 속성이 있지만 일부(예: searchParams 속성)가 누락된 다른 객체인 Location입니다.
URL 개체가 아니더라도 window.location을 사용하여 새 URL 개체를 구성할 수 있습니다. window.location을 URL 생성자에 전달하여 현재 URL을 기반으로 searchParams 및 모든 기능을 갖춘 새로운 완전한 URL을 생성하거나 상대 URL을 생성할 때 이를 기본 URL로 사용할 수도 있습니다.
const url = new URL('https://example.com/api/search?query=foobar&maxResults=10'); console.log(url.searchParams.get('query'); // foobar console.log(url.searchParams.get('maxResults'); // 10
URL을 사용하면 URL에서 경로를 쉽게 얻을 수 있습니다. 예를 들어 URL https://example.com/api/users/123/profile에서 경로 이름은 /api/users/123/profile입니다. 이 URL에서 사용자 ID인 123만 가져오려면 어떻게 해야 합니까?
앞서 논의한 것처럼 URL의 일부를 검증하고 추출하기 위해 적절한 정규식을 만드는 것이 어려울 수 있습니다.
아직 모든 브라우저에서 사용할 수는 없지만 URLPattern API를 사용하면 지정한 패턴과 일치하는 URL의 일부를 일치시키고 추출할 수 있습니다. 이는 단일 페이지 애플리케이션(SPA)의 클라이언트 측 라우팅과 같은 작업에 특히 유용할 수 있습니다.
사용자 프로필 URL을 예로 들어 사용자 ID를 가져오는 URLPattern을 생성해 보겠습니다. 앞에 : 문자를 사용하여 명명된 자리 표시자를 나타낼 수 있습니다. 이는 나중에 URL의 해당 부분과 일치시키는 데 사용할 수 있습니다.
const url = new URL('https://example.com/api/search?tag=tag1&tag=tag2&tag=tag3'); console.log(url.searchParams.getAll('tag')); // ['tag1', 'tag2', 'tag3']
URLPattern에서 exec를 호출하려면 유효한 URL이 필요합니다. URL의 각 부분(프로토콜, 호스트, 경로 이름 등)에 대한 속성을 포함하는 매처 객체를 반환합니다. 이러한 각 속성에는 :userId와 같은 자리 표시자 이름을 URL 내의 해당 값에 매핑하는 그룹 속성도 있습니다.
여기에서 수행한 것처럼 경로 이름과 같은 URL의 한 부분만 일치시키는 데만 관심이 있는 경우 URL 패턴에 와일드카드를 지정할 수도 있습니다. 또는 URL 문자열 대신 일치하려는 URL 부분이 포함된 객체를 전달할 수 있습니다.
let queryString = 'foo=bar'; queryString += '&baz=qux'; queryString += '&tag=' + encodeURIComponent('one&two'); console.log(queryString); // foo=bar&baz=qux&tag=one%26two
URLPattern API는 아직 모든 브라우저에서 사용할 수 없습니다. 글을 쓰는 시점에서는 아직 Firefox나 Safari에서 지원되지 않습니다. CanIUse.com에서 최신 브라우저 지원 정보를 확인할 수 있습니다.
URL API는 JavaScript에서 URL을 구성, 검증 및 조작하기 위한 다목적 인터페이스입니다. 수동 구문 분석이나 정규 표현식보다 사용하는 것이 더 안전하고 오류가 발생할 가능성이 적습니다. URLSearchParams 개체를 사용하면 문자열 연결이나 특수 문자 인코딩에 대한 걱정 없이 쿼리 문자열을 작성할 수 있습니다.
URLPattern API는 이를 한 단계 더 발전시켜 와일드카드와 이름이 지정된 자리 표시자를 지원하므로 앱의 요구 사항에 맞게 URL을 분할하고 분류할 수 있습니다! 추가 자료:
NPM:
function getQueryString(url) { const link = document.createElement('a'); link.href = url; return url.search; }
스크립트 태그:
const url = new URL('https://example.com/api/search?query=foobar'); console.log(url.host); // example.com console.log(url.pathname); // /api/search console.log(url.search); // ?query=foobar
3.(선택 사항) 스택과의 심층 통합을 위해 플러그인을 설치합니다.
지금 시작하세요
위 내용은 JavaScript에서 URL 작업의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!