JavaScript庫(kù)urlcat?之URL構(gòu)建器庫(kù)
urlcat 是一個(gè)小型的 JavaScript 庫(kù),它使構(gòu)建 URL 非常方便并防止常見錯(cuò)誤;
特性:
- 友好的 API
- 無(wú)依賴
- 壓縮后0.8KB大小
- 提供TypeScript類型
1.作用
在調(diào)用 HTTP API 時(shí),通常需要在 URL 中添加動(dòng)態(tài)參數(shù):
const API_URL = 'https://api.example.com/'; function getUserPosts(id, blogId, limit, offset) { ? const requestUrl = `${API_URL}/users/${id}/blogs/${blogId}/posts?limit=${limit}&offset=${offset}`; ? // send HTTP request }
正如你所看到的,這個(gè)最小的例子已經(jīng)很難閱讀了。這也是不正確的:
- 我忘記了 API_URL 常量末尾有一個(gè)斜杠,所以這導(dǎo)致了一個(gè)包含重復(fù)斜杠的
URL(https://api.example.com//users)
- 嵌入的值需要使用
encodeURIComponent
進(jìn)行轉(zhuǎn)義
我可以使用內(nèi)置的 URL 類來(lái)防止重復(fù)的斜杠和 URLSearchParams
來(lái)轉(zhuǎn)義查詢字符串。但我仍然需要手動(dòng)轉(zhuǎn)義所有路徑參數(shù)。
const API_URL = 'https://api.example.com/'; function getUserPosts(id, blogId, limit, offset) { ? const escapedId = encodeURIComponent(id); ? const escapedBlogId = encodeURIComponent(blogId); ? const path = `/users/${escapedId}/blogs/${escapedBlogId}`; ? const url = new URL(path, API_URL); ? url.search = new URLSearchParams({ limit, offset }); ? const requestUrl = url.href; ? // send HTTP request }
如此簡(jiǎn)單的任務(wù),卻又很難讀,寫也很乏味!這是這個(gè)小型庫(kù)可以幫助您的地方:
const API_URL = 'https://api.example.com/'; function getUserPosts(id, limit, offset) { ? const requestUrl = urlcat(API_URL, '/users/:id/posts', { id, limit, offset }); ? // send HTTP request }
這個(gè)庫(kù)會(huì)這樣處理:
- 轉(zhuǎn)義所有參數(shù)
- 將所有部分連接起來(lái)(它們之間總是正好有一個(gè) / 和 ?)
2.使用方法
目前,該軟件包通過(guò) npm 分發(fā)。 (Zip 下載和 CDN 即將推出)。
npm install --save urlcat
在Node.js中使用
官方支持 Node 10 及更高版本。由于代碼在內(nèi)部使用 URL 和 URLSearchParams 類,它們?cè)?v10 以下不可用,因此我們無(wú)法支持這些版本。
要構(gòu)建完整的 URL(最常見的用例):
const urlcat = require('urlcat').default;
要使用任何一個(gè)實(shí)用函數(shù):
const { query, subst, join } = require('urlcat');
要使用所有導(dǎo)出的函數(shù):
const { default: urlcat, query, subst, join } = require('urlcat');
在Typescript中使用
官方支持 TypeScript 2.1 及更高版本。
要構(gòu)建完整的 URL(最常見的用例):
import urlcat from 'urlcat';
要使用任何一個(gè)實(shí)用函數(shù):
import { query, subst, join } from 'urlcat';
要使用所有導(dǎo)出的函數(shù):
import urlcat, { query, subst, join } from 'urlcat';
在Deno中使用
import urlcat from 'https://deno.land/x/urlcat/src/index.ts'; console.log(urlcat('https://api.foo.com', ':name', { id: 25, name: 'knpwrs' }));
3.API
ParamMap:具有字符串鍵的對(duì)象
例如:{ firstParam: 1, 'second-param': 2 }
是一個(gè)有效的 ParamMap
。
urlcat:構(gòu)建完整的 URL
function urlcat(baseUrl: string, pathTemplate: string, params: ParamMap): string function urlcat(baseUrl: string, pathTemplate: string): string function urlcat(baseTemplate: string, params: ParamMap): string
例如:
urlcat('https://api.example.com', '/users/:id/posts', { id: 123, limit: 10, offset: 120 })
→ 'https://api.example.com/users/123/posts?limit=10&offset=120'
urlcat('http://example.com/', '/posts/:title', { title: 'Letters & "Special" Characters' })
→ 'http://example.com/posts/Letters%20%26%20%22Special%22%20Characters'
urlcat('https://api.example.com', '/users')
→ 'https://api.example.com/users'
urlcat('https://api.example.com/', '/users')
→ 'https://api.example.com/users'
urlcat('http://example.com/', '/users/:userId/posts/:postId/comments', { userId: 123, postId: 987, authorId: 456, limit: 10, offset: 120 })
→ 'http://example.com/users/123/posts/987/comments?authorId=456&limit=10&offset=120'
query:構(gòu)建查詢字符串
使用指定的鍵值對(duì)構(gòu)建查詢字符串。鍵和值被轉(zhuǎn)義,然后由 '&' 字符連接。
例如:
params | result |
---|---|
{} | '' |
{ query: 'some text' } | 'query=some%20text' |
{ id: 42, 'comment-id': 86 } | 'id=42&comment-id=86' |
{ id: 42, 'a name': 'a value' } | 'id=42&a%20name=a%20value' |
subst:替換路徑參數(shù)
用模板字符串中的值替換參數(shù)。模板可能包含 0 個(gè)或多個(gè)參數(shù)占位符。占位符以冒號(hào) (:) 開頭,后跟只能包含大寫或小寫字母的參數(shù)名稱。在模板中找到的任何占位符都將替換為 params 中相應(yīng)鍵下的值。
例如:
template | params | result |
---|---|---|
':id' | { id: 42 } | '42' |
'/users/:id' | { id: 42 } | '/users/42' |
'/users/:id/comments/:commentId' | { id: 42, commentId: 86 } | '/users/42/comments/86' |
'/users/:id' | { id: 42, foo: 'bar' } | '/users/42' |
join:使用一個(gè)分隔符連接兩個(gè)字符串
僅使用一個(gè)分隔符連接兩個(gè)部分。如果分隔符出現(xiàn)在 part1 的末尾或 part2 的開頭,則將其刪除,然后使用分隔符連接兩個(gè)部分。
例如:
part1 | separator | part2 | result |
---|---|---|---|
'first' | ',' | 'second' | 'first,second' |
'first,' | ',' | 'second' | |
'first' | ',' | ',second' | |
'first,' | ',' | ',second' |
到此這篇關(guān)于JavaScript庫(kù)urlcat 之URL構(gòu)建器庫(kù)的文章就介紹到這了,更多相關(guān)JavaScript URL構(gòu)建器庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
談?wù)勎覍?duì)JavaScript DOM事件的理解
DOM與事件是JavaScript最核心的組成部分之一,他們賦予了頁(yè)面無(wú)限的想象空間,你根本無(wú)法離開他們,否則js將寸步難行。本文給大家分享我對(duì)javascript dom事件的了解,對(duì)javascript dom事件相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2015-12-12使用JS監(jiān)聽鍵盤按下事件(keydown event)
這篇文章主要介紹了使用JS監(jiān)聽鍵盤按下事件(keydown event),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11javascript 具名函數(shù)的四種調(diào)用方式 推薦
看四種方式執(zhí)行結(jié)果沒有區(qū)別。但如果函數(shù)有返回值的話,用new方式調(diào)用時(shí)可能會(huì)讓你有些失望。2009-07-07javascript適配器模式和組合模式原理與實(shí)現(xiàn)方法詳解
這篇文章主要介紹了javascript適配器模式和組合模式原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了javascript適配器模式與組合模式相關(guān)原理、功能、實(shí)現(xiàn)方法與注意事項(xiàng),需要的朋友可以參考下2023-07-07JS遍歷樹層級(jí)關(guān)系實(shí)現(xiàn)原理解析
這篇文章主要介紹了JS遍歷樹層級(jí)關(guān)系實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08