nodeJS之URL

来源:http://www.cnblogs.com/xiaohuochai/archive/2017/06/04/6941108.html
-Advertisement-
Play Games

前面的話 在HTTP部分,詳細介紹了URL的相關知識。而nodejs中的url模塊提供了一些實用函數,用於URL處理與解析。本文將詳細介紹nodeJS中的URL URL對象 解析 URL 對象有以下內容,依賴於他們是否在 URL 字元串里存在。任何不在 URL 字元串里的部分,都不會出現在解析對象里 ...


前面的話

  在HTTP部分,詳細介紹了URL的相關知識。而nodejs中的url模塊提供了一些實用函數,用於URL處理與解析。本文將詳細介紹nodeJS中的URL

 

URL對象

  解析 URL 對象有以下內容,依賴於他們是否在 URL 字元串里存在。任何不在 URL 字元串里的部分,都不會出現在解析對象里

'http://user:[email protected]:8080/p/a/t/h?query=string#hash'
┌─────────────────────────────────────────────────────────────────────────────┐
│                                    href                                     │
├──────────┬┬───────────┬─────────────────┬───────────────────────────┬───────┤
│ protocol ││   auth    │      host       │           path            │ hash  │
│          ││           ├──────────┬──────┼──────────┬────────────────┤       │
│          ││           │ hostname │ port │ pathname │     search     │       │
│          ││           │          │      │          ├─┬──────────────┤       │
│          ││           │          │      │          │ │    query     │       │
"  http:   // user:pass @ host.com : 8080   /p/a/t/h  ?  query=string   #hash "
│          ││           │          │      │          │ │              │       │
└──────────┴┴───────────┴──────────┴──────┴──────────┴─┴──────────────┴───────┘

  【href】: 準備解析的完整的 URL,包含協議和主機(小寫)

'http://user:[email protected]:8080/p/a/t/h?query=string#hash'

  【protocol】: 請求協議, 小寫

'http:'

  【slashes】: 協議要求的斜杠(冒號後)

truefalse

  【host】: 完整的 URL 小寫 主機部分,包含埠信息

'host.com:8080'

  【auth】: url 中的驗證信息

'user:pass'

  【hostname】: 功能變數名稱中的小寫主機名

'host.com'

  【port】: 主機的埠號

'8080'

  【pathname】: URL 中的路徑部分,在主機名後,查詢字元前,包含第一個斜杠

'/p/a/t/h'

  【search】: URL 中的查詢字元串,包含開頭的問號

'?query=string'

  【path】: pathname 和 search 連在一起

'/p/a/t/h?query=string'

  【query】: 查詢字元串中得參數部分,或者使用 querystring.parse() 解析後返回的對象

'query=string' or {'query':'string'}

  【hash】: URL 的 “#” 後面部分(包括 # 符號)

'#hash'

 

URL方法

  URL模塊包含分析和解析 URL 的工具。調用 require('url') 來訪問模塊

var url = require('url');
/*
{ parse: [Function: urlParse],
  resolve: [Function: urlResolve],
  resolveObject: [Function: urlResolveObject],
  format: [Function: urlFormat],
  Url: [Function: Url] }
 */
console.log(url);

【url.parse(urlStr[, parseQueryString][, slashesDenoteHost])】

  輸入 URL 字元串,返回一個對象

  第二個參數parseQueryString(預設為false),如為false,則urlObject.query為未解析的字元串,比如author=%E5%B0%8F%E7%81%AB%E6%9F%B4,且對應的值不會decode;如果parseQueryString為true,則urlObject.query為object,比如{ author: '小火柴' },且值會被decode

  第三個參數slashesDenoteHos(預設為false),如果為true,可以正確解析不帶協議頭的URL,類似//foo/bar里的foo就會被認為是hostname;如果為false,則foo被認為是pathname的一部分

var url = require('url');
var str = 'http://user:[email protected]:8080/p/a/t/h?author=%E5%B0%8F%E7%81%AB%E6%9F%B4#hash';
/*
Url {
  protocol: 'http:',
  slashes: true,
  auth: 'user:pass',
  host: 'host.com:8080',
  port: '8080',
  hostname: 'host.com',
  hash: '#hash',
  search: '?author=%E5%B0%8F%E7%81%AB%E6%9F%B4',
  query: 'author=%E5%B0%8F%E7%81%AB%E6%9F%B4',
  pathname: '/p/a/t/h',
  path: '/p/a/t/h?author=%E5%B0%8F%E7%81%AB%E6%9F%B4',
  href: 'http://user:[email protected]:8080/p/a/t/h?author=%E5%B0%8F%E7%81%AB%E6%9F%B4#hash' }
 */
console.log(url.parse(str));
var url = require('url');
var str = 'http://user:[email protected]:8080/p/a/t/h?author=%E5%B0%8F%E7%81%AB%E6%9F%B4#hash';
/*
Url {
  protocol: 'http:',
  slashes: true,
  auth: 'user:pass',
  host: 'host.com:8080',
  port: '8080',
  hostname: 'host.com',
  hash: '#hash',
  search: '?author=%E5%B0%8F%E7%81%AB%E6%9F%B4',
  query: { author: '小火柴' },
  pathname: '/p/a/t/h',
  path: '/p/a/t/h?author=%E5%B0%8F%E7%81%AB%E6%9F%B4',
  href: 'http://user:[email protected]:8080/p/a/t/h?author=%E5%B0%8F%E7%81%AB%E6%9F%B4#hash' }
  */
console.log(url.parse(str,true));
var url = require('url');
var str = '//foo/bar';
var result1 = url.parse(str,true);
var result2 = url.parse(str,true,true);
console.log(result1.path);//'//foo/bar'
console.log(result1.pathname);//'//foo/bar'
console.log(result1.hostname);//null
console.log(result2.path);//'/bar'
console.log(result2.pathname);//'/bar'
console.log(result2.hostname);//'foo'

【url.format(urlObject)】

  url.parse(str)的反向操作,輸入一個解析過的 URL 對象,返回格式化過的字元串

  urlObject包含了很多欄位,比如protocol、slashes、protocol等,且不一定需要全部傳,所以有一套解析邏輯

  格式化的工作流程如下

href 會被忽略
protocol 無論是否有末尾的 : (冒號),會同樣的處理
http, https, ftp, gopher, file 協議會被添加尾碼://
mailto, xmpp, aim, sftp, foo, 等協議添加尾碼:
slashes 如果協議需要 ://,設置為 true
僅需對之前列出的沒有斜杠的協議,比如議 mongodb://localhost:8000/
auth 如果出現將會使用.
hostname 僅在缺少 host 時使用
port 僅在缺少 host 時使用
host 用來替換 hostname 和 port
pathname 無論結尾是否有 / 將會同樣處理
search 將會替代 query屬性
無論前面是否有 / 將會同樣處理
query (對象; 參見 querystring) 如果沒有 search,將會使用
hash 無論前面是否有#,都會同樣處理
var url = require('url');
var obj = {
  protocol: 'http:',
  auth: 'user:pass',
  host: 'host.com:8080',
  hash: '#hash',
  query: { author: '小火柴' }
}
//http://user:[email protected]:8080?author=%E5%B0%8F%E7%81%AB%E6%9F%B4#hash
console.log(url.format(obj));

【url.resolve(from, to)】

  url.resolve()方法以一種瀏覽器解析超鏈接的方式把一個目標URL解析成相對於一個基礎URL,參數如下

from <String> 解析時相對的基本 URL。
to <String> 要解析的超鏈接 URL。
var url = require('url');
console.log(url.resolve('/one/two/three', 'four'));         // '/one/two/four'
console.log(url.resolve('http://example.com/', '/one'));    // 'http://example.com/one'
console.log(url.resolve('http://example.com/one', '/two')); // 'http://example.com/two'

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、CSS定義 CSS 指層疊樣式表 (Cascading Style Sheets),是一種樣式表語言,用來描述 HTML 或 XML(包括如 SVG、XHTML 之類的 XML 分支語言)文檔的呈現。CSS 描述了在屏幕、紙質、音頻等其它媒體上的元素應該如何被渲染的問題。 2、為何使用CSS 網 ...
  • 在前面兩篇博客中,我們討論了Android中的事件分發的相關內容,那麼在本篇博客當中,我們就簡單探討一下html或javascript中的事件分發機制,併進行簡單的對比。 在前端中,對事件進行綁定有三種方式。 (1).在DOM中綁定。 (2).在腳本中綁定。 (3).通過監聽事件 綁定 而對於前兩種 ...
  • 一、apply,和call的用法。 先來一個與本次博文無關的東西,就是apply和call的用法。其實apply和call的用法都一樣,只是他們的傳參不一樣。apply是數組,而call是單獨的傳,類似枚舉。 1.列子一把arguments轉化為標準數組,可以使用push等方法。 2.如何把argu ...
  • HTML 一、簡介 1.HTML是超文本標記語言,標準通用標記語言下的一個應用,解釋性語言。 2.“超文本”就是指頁面內可以包含圖片、鏈接,甚至音樂、程式等非文字元素。 3.超文本標記語言的結構包括“頭”部分(英語:Head)、和“主體”部分(英語:Body),其中“頭”部提供關於網頁的信息,“主體 ...
  • 頭部 header 用於頭部 主要內容 main 用於主體內容(中部) 左側 main-left 左側佈局 右側 main-right 右側佈局 外套 wrap 用於最外層 導航條 nav 網頁菜單導航條 內容 content 用於網頁中部主體 底部 footer 用於底部 頭部 header 用於 ...
  • 【塊級標簽與行級標簽的區別】 1.塊級標簽: 預設寬度100%(獨占一行) 自動換行(右邊不能有任何東西) 可以使用css設置寬度高度 2.行級標簽: 內容寬度,由內容撐開(內容多寬,寬度就占多寬) 不會自動換行(從左往右依次排列) 【常見的行級標簽】 span(文本) img(圖片) em(強調) ...
  • 優雅降級(graceful degradation):一開始就構建站點的完整功能,然後針對瀏覽器測試和修複。 漸進增強(progressive enhancement):一開始只構建站點的最少特性,然後不斷針對各瀏覽器追加功能。優雅降級:使用優雅降級方案,Web站點在所有新式瀏覽器中都能正常工作,如 ...
  • [1]基礎 [2]代碼組織 [3]文件操作 [4]網路操作 [5] [6] ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...