溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JSON文件上傳操作實(shí)例分析

發(fā)布時(shí)間:2022-03-01 10:36:55 來源:億速云 閱讀:704 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“JSON文件上傳操作實(shí)例分析”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“JSON文件上傳操作實(shí)例分析”文章能幫助大家解決問題。

想想你要表達(dá)的操作

一個(gè)常見的錯(cuò)誤是關(guān)注操作所需的特定文件格式。相反,我們應(yīng)該考慮我們想要表達(dá)的操作。文件格式僅決定用于操作的媒體類型。

例如,假設(shè)我們要設(shè)計(jì)一個(gè) API,讓用戶將頭像圖片上傳到他們的用戶帳戶。

在這里,出于各種原因,將頭像圖像與用戶帳戶資源分開通常是一個(gè)好主意:

  • 頭像圖像不太可能改變,因此它可能是緩存的一個(gè)很好的候選者。另一方面,用戶帳戶資源可能包含諸如上次登錄日期之類的經(jīng)常更改的內(nèi)容。

  • 并非所有訪問用戶帳戶的客戶端都可能對(duì)頭像圖像感興趣。因此,可以節(jié)省帶寬。

  • 對(duì)于客戶端來說,通常最好單獨(dú)加載圖像(想想使用 <img> 標(biāo)簽的 Web 應(yīng)用程序)

可以通過以下方式訪問用戶帳戶資源:

/users/<user-id>

我們可以想出一個(gè)代表頭像圖像的簡(jiǎn)單子資源:

/users/<user-id>/avatar

上傳頭像是一個(gè)簡(jiǎn)單的替換操作,可以通過 PUT 表示:

PUT /users/<user-id>/avatar
Content-Type: image/jpeg
 
<image data>

如果用戶想要?jiǎng)h除他的頭像,我們可以使用簡(jiǎn)單的 DELETE 操作:

DELETE /users/<user-id>/avatar

當(dāng)然,客戶需要一種顯示頭像的方法。因此,我們可以使用 GET 提供下載操作:

GET /users/<user-id>/avatar

返回

HTTP/1.1 200 Ok
Content-Type: image/jpeg
 
<image data>

在這個(gè)簡(jiǎn)單的例子中,我們使用了一個(gè)帶有常見更新、刪除、獲取操作的新子資源。唯一的區(qū)別是我們使用圖像媒體類型而不是 JSON 或 XML。

讓我們看一個(gè)不同的例子。

假設(shè)我們提供了一個(gè) API 來管理產(chǎn)品數(shù)據(jù)。我們希望通過一個(gè)選項(xiàng)來擴(kuò)展此 API,從上傳的 CSV 文件中導(dǎo)入產(chǎn)品。我們應(yīng)該考慮一種表達(dá)產(chǎn)品導(dǎo)入操作的方法,而不是考慮文件上傳。

可能最簡(jiǎn)單的方法是將 POST 請(qǐng)求發(fā)送到單獨(dú)的資源:

POST /product-import
Content-Type: text/csv
 
<csv data>

或者,我們也可以將其視為產(chǎn)品的批量操作。PATCH 方法是一種表達(dá)對(duì)集合的批量操作的可能方式。在這種情況下,CSV 文檔描述了對(duì)產(chǎn)品集合的期望更改。

例如:

PATCH /products
Content-Type: text/csv
 
action,id,name,price
create,,Cool Gadget,3.99
create,,Nice cap,9.50
delete,42,,

此示例創(chuàng)建兩個(gè)新產(chǎn)品并刪除 id 為42的產(chǎn)品。

處理文件上傳可能需要相當(dāng)長(zhǎng)的時(shí)間。所以考慮將其設(shè)計(jì)為異步 REST 操作。

混合文件和元數(shù)據(jù)

在某些情況下,我們可能需要將額外的元數(shù)據(jù)附加到文件中。例如,假設(shè)我們有一個(gè) API,用戶可以在其中上傳假日照片。除了實(shí)際的圖像數(shù)據(jù),照片還可能包含描述、拍攝地點(diǎn)等。

在這里,我會(huì)推薦使用兩個(gè)單獨(dú)的操作,原因與上一節(jié)中關(guān)于頭像圖像的原因類似。即使這里的情況有點(diǎn)不同(數(shù)據(jù)直接鏈接到圖像),它通常也是更簡(jiǎn)單的方法。

在這種情況下,我們可以首先通過發(fā)送實(shí)際圖像來創(chuàng)建照片資源:

POST /photos
Content-Type: image/jpeg
 
<image data>

作為回應(yīng),我們得到:

HTTP/1.1 201 Created
Location: /photos/123

之后,我們可以將額外的元數(shù)據(jù)附加到照片中:

當(dāng)然,我們也可以反過來設(shè)計(jì),在圖像之前發(fā)送元數(shù)據(jù)。

在 JSON 或 XML 中嵌入 Base64 編碼的文件

如果無法在單獨(dú)的請(qǐng)求中拆分文件內(nèi)容和元數(shù)據(jù),我們可以使用Base64 編碼將文件嵌入到 JSON/XML 文檔中。使用 Base64 編碼,我們可以將二進(jìn)制格式轉(zhuǎn)換為文本表示,該文本表示可以集成到其他基于文本的格式中,例如 JSON 或 XML。

示例請(qǐng)求可能如下所示:

POST /photos
Content-Type: application/json
 
{
    "width": "1280",
    "height": "920",
    "filename": "funny-cat.jpg",
    "image": "TmljZSBleGFt...cGxlIHRleHQ="
}

將媒體類型與多部分請(qǐng)求混合

在單個(gè)請(qǐng)求/響應(yīng)中傳輸圖像數(shù)據(jù)和元數(shù)據(jù)的另一種可能方法是多部分媒體類型。

多部分媒體類型需要一個(gè)邊界參數(shù),用作不同正文部分之間的分隔符。以下請(qǐng)求由兩個(gè)正文部分組成。第一個(gè)包含圖像,而第二個(gè)部分包含元數(shù)據(jù)。

例如:

POST /photos
Content-Type: multipart/mixed; boundary=foobar
 
--foobar
Content-Type: image/jpeg
 
<image data>
--foobar
Content-Type: application/json
 
{
    "width": "1280",
    "height": "920",
    "filename": "funny-cat.jpg"
}
--foobar--

不幸的是,多部分請(qǐng)求/響應(yīng)通常很難處理。例如,并非每個(gè) REST 客戶端都能夠構(gòu)建這些請(qǐng)求,并且很難在單元測(cè)試中驗(yàn)證響應(yīng)。

關(guān)于“JSON文件上傳操作實(shí)例分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI