从 URL 获取协议、域和端口

2022-08-29 23:37:24

我需要从给定的URL中提取完整的协议,域和端口。例如:

https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer
>>>
https://localhost:8181

答案 1
const full = location.protocol + '//' + location.host;

答案 2

这些答案似乎都不能完全解决这个问题,它需要一个任意的url,而不是当前页面的URL。

方法 1:使用 URL API(注意:不支持 IE11)

您可以使用 URL API(IE11 不支持,但在其他任何地方都可用)。

这也使得访问搜索参数变得容易。另一个好处是:它可以在Web Worker中使用,因为它不依赖于DOM。

const url = new URL('http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');

方法 2(旧方法):在 DOM 中使用浏览器的内置解析器

如果您需要在较旧的浏览器上使用它,请使用它。

//  Create an anchor element (note: no need to append this element to the document)
const url = document.createElement('a');
//  Set href to any path
url.setAttribute('href', 'http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');

就是这样!

浏览器的内置解析器已经完成了它的工作。现在,您可以获取所需的部分(请注意,这适用于上述两种方法):

//  Get any piece of the url you're interested in
url.hostname;  //  'example.com'
url.port;      //  12345
url.search;    //  '?startIndex=1&pageSize=10'
url.pathname;  //  '/blog/foo/bar'
url.protocol;  //  'http:'

奖励:搜索参数

您可能还想分解搜索网址参数,因为'?startIndex=1&pageSize=10'本身并不太有用。

如果您使用了上面的方法 1(URL API),则只需使用 searchParams getters:

url.searchParams.get('startIndex');  // '1'

或者获取所有参数:

function searchParamsToObj(searchParams) {
  const paramsMap = Array
    .from(url.searchParams)
    .reduce((params, [key, val]) => params.set(key, val), new Map());
  return Object.fromEntries(paramsMap);
}
searchParamsToObj(url.searchParams);
// -> { startIndex: '1', pageSize: '10' }

如果您使用方法 2(旧方法),则可以使用如下方法:

// Simple object output (note: does NOT preserve duplicate keys).
var params = url.search.substr(1); // remove '?' prefix
params
    .split('&')
    .reduce((accum, keyval) => {
        const [key, val] = keyval.split('=');
        accum[key] = val;
        return accum;
    }, {});
// -> { startIndex: '1', pageSize: '10' }