匯入Web服務資料:JMP® 14中的新HTTP請求(US 2018 231)
等級:中級
Bryan Boone,SAS JMP 首席軟體開發人員
政府和私人實體越來越多地透過 RESTful 服務在網路上提供其資料。 JMP 14 具有一個名為HTTP 請求的新功能,可透過 JSL 取得,可讓您存取這些 RESTful 服務。本文介紹了什麼是 RESTful 服務,並提供瞭如何使用HTTP 請求將新資料引入 JMP 的幾個範例。
什麼是 REST
REST,即表述性狀態轉移,是一種在互聯網上提供電腦系統之間互通性的方式。 RESTful 服務是一種利用此範例的基於 Web 的服務。 RESTful API 是一種應用程式介面 (API),它使用 HTTP 請求來取得、發布、 PUT和DELETE數據,以便與 RESTful 服務進行互動。
HTTP 協定定義了一組請求 HTTP 方法來指示客戶端希望伺服器對資源執行的操作。它們是:
|
得到
|
請求資源
|
|
頭
|
僅請求資源元數據
|
|
郵政
|
請求接受資源
|
|
放
|
儲存或建立資源的請求
|
|
刪除
|
刪除資源的請求
|
|
修補
|
請求修改資源狀態
|
新術語,熟悉的活動
這看起來像是一個全新的概念,但您已經熟悉兩種最常見的請求方法,得到和郵政。
得到
得到has two personalities.
第一種人格只是獲得一種資源。也就是說,其目的只是存取網路資源。這可以在圖 1 中看到。這裡,瀏覽器正在造訪網頁。 
Figure 1. “得到for a web resource”
第二個是取得(存取)資源,以及所謂的查詢字串。查詢字串是 Web 資源定義的一組鍵/值對,客戶端使用它們來請求伺服器使用這些參數來過濾或修改請求。這可以在圖2中看到。這裡瀏覽器要求伺服器使用以下命令修改取得請求:
- q=jmp
- SPF=1499884333995

圖 2.“使用查詢字串取得Web 資源”
郵政
另一方面,郵政政則更為複雜。郵件政請求伺服器更改或建立資源。郵政通常包含一個 HTML 表單,而該表單包含字元資料的鍵/值對和/或檔案的鍵/值對的集合。圖 3 是使用者登入亞馬遜的範例。這裡的鍵/值對是:
圖 3.“郵政表單資料到網路資源”
為何使用它
HTTP 協定讓我們將資訊高速公路想像成「高速公路已經鋪好,路牌已經立好,橋樑也已經建成」。該標準使得新的數據管理公司得以成立。此外,HTTP 標準的採用消除了成熟公司中經常出現的資訊孤島。其中包括:
|
Text-Processing.com(情緒資料)
|
詹金斯
|
|
有
|
中心
|
|
辦公室 365
|
Google
|
|
投遞箱
|
一個驅動器
|
|
AWS(亞馬遜網路服務)
|
美國人口普查局
|
|
在
|
PubChem
|
|
《紐約時報》
|
Fitbit
|
|
雅虎
|
比特幣
|
|
漫威漫畫
|
SAS
|
|
OpenAQ
|
跳轉
|
如何使用
JSON
JSON(JavaScript 物件表示法)是一種輕量級的資料交換格式。它是基於 JavaScript 程式語言的子集。 JSON 是一種獨立於語言的文字格式,但使用大多數程式設計師已經熟悉的概念。
JSON 建立在兩個結構之上:
- 名稱/值對的集合。 (字典、雜湊表、關聯數組…)
- 值的有序列表。 (陣列、向量、列表…)
新術語,熟悉的活動(再次)
JSL
當涉及 JMP 時,JSL 是首選的腳本語言。 JSON 可能是新術語,但 JSL 支援 JSON 所需的兩種資料結構。
清單
清單是儲存項目的容器,例如:
- 數位
- 變數
- 字串
- 表達式(例如賦值或函數呼叫)
- 矩陣
- 嵌套列表
關聯數組
- 關聯數組將唯一鍵映射到非唯一的值。關聯數組也稱為字典、映射、雜湊映射或雜湊表。
JSL 還包含兩個特定於 JSON 處理的函數。
解析 JSON
- 根據 JSON 資料的結構將 JSON 文字轉換為關聯數組或清單。
作為 JSON 表達式
這些功能允許腳本編寫者在 JSL 容器和 JSON 之間無縫地進行轉換。
HTTP 請求
HTTP 請尋求是 JMP 14 中的新功能。最初,該技術是為了處理 JMP 和 JMP Public 之間的互動而創建的。人們很快就意識到它除了將資料發佈到 JMP Public 之外還有更多的應用,而該技術在 JSL 中以HTTP 請尋求的形式出現。
HTTP 請求入門
HTTP 請求無縫支援 http 和 https 協議,並封裝了您期望從 cURL 獲得的大部分行為。
cURL 用於命令列或腳本中傳輸資料。它也用於汽車、電視、路由器、印表機、音訊設備、手機、平板電腦、機上盒、媒體播放器,並且是每天影響數十億人的數千個軟體應用程式的網路傳輸主幹。
更重要的是,您可以將HTTP 請尋求視為將 Web 資源與 JSL 綁定在一起的黏合劑。也就是說, HTTP 請要求與 Web 資源進行通訊並允許腳本編寫者以 JSL 形式處理回應。 JSL 的複雜度由作者控制。
與 Web 資源互動時使用最常見的 HTTP 方法是:
在 GET 操作中使用 HTTP 請求
AGetaction可能是最常見的HTTP 請求操作。此操作是唯讀操作,可將資料帶入 JMP。
HTTP 請求的常見訊息:
Figure 4. “
HTTP 請求
得到
”
HTTP 請求可獲得操作通常伴隨「查詢字串」以將參數傳送至 Web 資源。圖 5 使用帶有「查詢字串」的HTTP 請求。在 JSL 中, 「查詢字串」是一個關聯數組,它將鍵對應到字元值或字元值清單。當圖5中的腳本運行時,URL將自動擴展為:
http://quotes.rest/qod.json?category=inspire
Figure 5. “
HTTP 請求
得到
using a ‘
查詢字串'
”
在 POST 操作中使用 HTTP 請求
HTTP 請求
郵政
actions are often more complex.
HTTP 請求的常見訊息:
-
“方法”
-
“網址”
-
“形式”
-
“JSON”
-
“文件”
-
“Blob”
-
“發送”
圖 6 顯示了HTTP 請求「表單」資料。在 JSL 中, “表單”資料可以有兩個屬性, “字段”和/或“檔案” 。它們都是 JSL關聯數組,將鍵對應到字元值或字元值列表。對於「檔案」 ,字元值或字元值清單是您想要新增至「表單」的檔案名稱。
圖 6.“使用表單的HTTP 請求郵件”
圖 7 顯示了HTTP 請求「 JSON」資料。在 JSL 中, 「JSON」可以是關聯資料庫,也可以是 JSON 格式的字元資料。因為 JSON Expr將建立一個定義明確的 JSON 物件以與HTTP 請求一起使用。 JSON 資料作為請求主體發送。 
Figure 7. “
HTTP 請求
郵政
using ‘
JSON'
”
圖 8 顯示了HTTP 請求「檔案」資料。在 JSL 中, “File”是您想要作為請求主體發送的檔案名稱。 
Figure 8. “
HTTP 請求
郵政
using ‘
文件'
”
HTTP 的最後一個操作是請求「 Blob」資料。在 JSL 中, 「Blob」是您想要作為請求主體發送的二進位 blob 資料。這意味著您不必在將文件作為請求的一部分發送之前將其寫入磁碟。
這
得到
行動是最簡單的請求,而
郵政
是最複雜的。之間的相互作用
HTTP 請求
並且 Web 資源始終由伺服器定義。儘管 HTTP 協定是一個定義明確的標準,但資料(和資料結構)是根據每個 Web 資源定義的。也就是說,儘管 One Drive 和 Dropbox 執行類似的功能,但它們的 API 不同。
退回寄件人
HTTP 「請求」訊息中的資料可以是字元資料、二進位 blob 資料或空,這取決於 Web 資源。檢查傳回的資料是否為空是資料調查最粗略的等級(除了無之外)。但是,如果您需要細粒度的調查,您可以使用“ Is String”來檢查字元資料。
對於更細粒度的調查,您可以使用「取得 MIME 類型」 。常見的 MIME 類型可以在本文參考部分的MIME 類型不完整清單文章中找到。
最後,如果需要,您可以使用下列訊息調查來自 Web 資源的低階 HTTP 狀態碼:
|
“有訊息”
|
100-199
|
|
“成功了”
|
200-299
|
|
“有重定向”
|
300-399
|
|
“客戶端出現錯誤”
|
400-499
|
|
“伺服器錯誤”
|
500-599
|
|
“有錯誤”
|
客戶端或伺服器有錯誤
|
|
“獲取狀態”
|
HTTP 狀態碼
|
HTTP 狀態碼描述可以在本文參考部分的狀態碼定義文章中找到。
在哪裡使用它
儘管HTTP 請請求能夠處理來自任何 Web 資源的字元資料或二進位 Blob 數據,但我們將重點放在來自 RESTful 服務的字元數據,即 JSON 資料。
這很甜蜜
PubChem 是一家基於使用 REST 的 HTTP 協定標準而成立的新資料管理公司。 PubChem 成立於 2004 年,是美國國立衛生研究院 (NIH) 的開放化學資料來源。每月都會使用來自大學、製藥公司、政府機構和化學品供應商等機構的數百個資料來源來更新 PubChem 記錄。它是最大的公開化學資訊來源集合。
PubChem 將其資料查詢分解為物質、化合物和分析等。從那裡,您可以獲得大量感興趣的屬性、描述、劑量和其他特徵。
我將其解讀為 M&M 成分。 
圖 9。 “普通 M&M 配料”
我編寫了一個 JSL 腳本,創建了一個包含普通 M&M 成分的 JMP 資料表,以查看其中含有什麼。毫不奇怪,這些成分含有大量人工色素。
JMP 部分資料表表示形式如下所示: 
圖 10.“部分原味 M&M 成分資料表”
當 JSL 腳本運行時, HTTP 請求用於檢索物質或化合物圖像以及 PubChem 的 RESTful 服務提供的其他屬性。 
圖 11.“包含 PubChem 資料的部分普通 M&M 成分資料表”
感興趣的 RESTful 服務 URL 是:
( [NAME]是圖 9 和 10 中的物質或化合物名稱。)
要檢索像乳糖這樣的化合物的圖像數據, HTTP 請求看起來像: 
圖 12.“從 PubChem獲取Lactose 的圖像”

圖 13.“
獲取並顯示來自 PubChem 的 Lactose 圖像”
乳糖請求使用 PubChem 的化合物端點。這裡使用了兩個附加概念。第一個是編碼 URI 。 URI 編碼(也稱為百分比編碼)可確保 RESTful URL 僅包含 ASCII 字元(幸運的是 Lactose 確實包含 ASCII 字元)。第二個概念是「取得MIME類型」 。從這個 PubChem 端點回傳的是二進位 blob 資料(PNG 圖片)。 「取得 MIME 類型」檢查確保在將 blob 與 New Image 一起使用之前,該 blob 確實是 PNG,因為如果未找到 PNG,此端點將傳回字元資料。
若要擷取 JSON 資料中的乳糖完整記錄, HTTP 請求如下所示:
圖 14.“從 PubChem取得Lactose 的完整記錄”
PubChem 定義的端點指定/JSON後綴表示 RESTful 服務應該傳回 JSON 數據,因此無需檢查「資料」的 MIME 類型。但是,我們確實必須處理 JSON。有[至少]兩種方法可以處理傳回的「資料」 。第一種是使用「JSON轉資料表」 。這將嘗試從「資料」建立 JMP 資料表。對於矩形或表格數據,這種方法效果很好(而且速度很快)。但是,並非所有 RESTful 服務都會傳回表格資料(PubChem 就是其中之一)。處理回傳資料的第二種方式是「解析 JSON」 。這將建立一個 JSL關聯資料庫。這意味著您不必解析 JSON。但是,您確實需要知道返回的資料是如何構成的。也就是說,您需要知道它是鍵/值對還是鍵/值對。這並不像看起來那麼難,因為您可以在 JMP 日誌中捕獲原始 JSON 並使用任何 JSON 編輯器來檢查其結構。
乳糖的 JSON 資料部分顯示如下: 
圖 15.“來自 PubChem 的部分乳糖 JSON 資料”
此編輯器並排顯示原始 JSON 和對應的 JSON 物件。當您檢查資料(JSON 中的 {..})時,請考慮 JSL關聯備份。同樣,當你遇到 [..] 時,想想 JSL清單。
使用此技術,您可以修改圖 14 所示的完整記錄腳本,並使用它來建立乳糖屬性的 JMP 資料表: 
圖 16.“從 PubChem取得Lactose 的完整記錄並將“ props”製作成資料表”
此範例使用Parse JSON將 PubChem 中的原始 JSON 轉換為 JSL相關數字組。在研究了 JSON 資料結構之後,我們意識到我們只對 Lactose JSON 中的「props」資料感興趣。然後,我們可以使用熟悉的 JSL關聯資料庫導覽來檢索在「PC_Compounds」處找到的 JSL清單。我們只需要清單中的第一個項目(因為大多數「道具」都是重複的)
“道具”
data is a JSL
關聯數組
so we can use
作為 JSON 表達式
to translate
“道具”
back to JSON and use it in
JSON 到資料表
. The result is in Figure 17.
圖 17.“部分乳糖性質資料表”
請記住, HTTP 請求只是將 Web 資源綁定到 JSL 的黏合劑。一旦將資料輸入 JSL,您就可以根據需要簡單或複雜地使用它。
令人讚嘆的事情
2014年,漫威漫畫創建了一項RESTful服務,讓用戶可以存取70年的漫畫資訊。漫威漫畫 API 僅受編劇的想像力的限制,因此我當然必須註冊一個密鑰並利用它來看看我能找到什麼。我寫了一個marvel:API JSL 函數,它使用了貫穿 Marvel Universe 的各種欄位。
作為死侍的粉絲,我提出了一個初始查詢並創建了此資料表: 
圖 18.“部分死侍資料表。”
這揭開了漫威漫畫宇宙中 4 個不同的死侍角色的面紗。我對第一個角色的身份很感興趣,並選擇了我創建的系列點擊事件處理程序。給定點擊的來源,奇蹟:API函數可以向 Marvel 發出新的查詢,其中傳回值說明了 Deadpool 在 MCU 中的交叉位置。我將結果限制為 50 行;然而,我發現了一些有趣的結果。我對「 title」和「startYear」進行了快速分佈分析,只是想看看死侍的人氣何時上升、下降(以及再次上升)。
圖 19.“部分死侍分佈。”
圖 19 顯示,2007 年死侍出現在許多不同的漫威漫畫作品中,包括:
- 復仇者聯盟:倡議 (2007-2010)
- 電索與死侍
- 內戰:X戰警宇宙。
2007 年後,人們對死侍的興趣再次減弱,但在瑞安雷諾茲在《X 戰警前傳:金剛狼》(2009 年)中首次飾演該角色後,人們對該角色的興趣再次升溫(如分析所示),並在 2011 年達到頂峰。
2012-2015年,漫威漫畫宇宙在《死侍殺死》中爆炸,漫威重啟了漫威宇宙。
最後,2016-2018 年沒有什麼意外。那時電影就上映了。
《死侍 2》中的彼得對漫威漫畫 API 進行了最好的總結,「我剛剛看到這個廣告,覺得它看起來很有趣」。
使用的約定
當 Web 資源基於 REST 時,使用術語 RESTful 服務
術語「Web 資源」是隱含通用 Web 存取時使用的通用術語。
HTTP 操作以粗體顯示
按鈕/對話方塊控制項“加引號並加粗”
超連結帶有下劃線
JSL 物件和函數以斜體顯示
JSL 變數/列/訊息名稱“用引號括起來並加斜體”
參考
Hawk, Sandro(2011 年 12 月 16 日) REST取自https://www.w3.org/2001/sw/wiki/REST
W3.org方法定義取自https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
W3.org
狀態代碼定義
retrieved
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
Mozilla.org(2018 年 5 月 13 日) HTTP 請求方法取自https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
JSON.org(2017 年 12 月) JSON 簡介,取自https://www.json.org
JMP.com (2018, July 12)
清單
retrieved from
https://www.jmp.com/support/help/14/lists.shtml
JMP.com(2018 年 7 月 12 日)關聯陣列的使用,取自https://www.jmp.com/support/help/14/work-with-associative-arrays.shtml
CURL 命令列工具和庫,用於使用從https://curl.haxx.se/檢索的URL 傳輸數據
W3.org(2015 年 1 月 22 日) 《網路安全》摘自https://www.w3.org/2001/tag/doc/web-https
W3.org(2014 年 6 月 11 日) HTTP - 超文本傳輸協議,取自https://www.w3.org/Protocols/
Mozilla.org (2018, July 3)
MIME 類型不完整列表
retrieved from
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types
PubChem.ncbi.nlm.nih.gov有關 PubChem 的資訊取自https://pubchemdocs.ncbi.nlm.nih.gov/
MMs.com成分取自http://www.mms.com/us/nutrition
W3Schools.com HTML URL 編碼參考資料來自https://www.w3schools.com/tags/ref_urlencode.asp
Developer.marvel.com開發者入口網站擷取自https://developer.marvel.com/