导入Web服务数据:JMP® 14中的新HTTP请求(US 2018 231)
级别:中级
Bryan Boone,SAS JMP 首席软件开发人员
政府和私营实体越来越多地通过 RESTful 服务在互联网上提供数据。JMP 14 新增了一项名为HTTP 请求的功能,可通过 JSL 使用,让您可以访问这些 RESTful 服务。本文介绍了什么是 RESTful 服务,并提供了几个示例,说明如何使用HTTP 请求将新数据导入 JMP。
什么是 REST
REST,即表述性状态转移 (Representational State Transfer),是一种在互联网上提供计算机系统间互操作性的方式。RESTful 服务是一种利用此范式的 Web 服务。RESTful API 是一种应用程序接口 (API),它使用 HTTP 请求对GET 、 POST 、 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. “邮政表单数据到Web资源”
为何使用它
HTTP 协议让我们可以将信息高速公路想象成“高速公路已经铺好,路标已经安装,桥梁也已经建成”。该标准催生了新的数据管理公司。此外,HTTP 标准的采用也消除了成熟公司中常见的信息孤岛。这些公司包括:
|
Text-Processing.com(情感数据)
|
詹金斯
|
|
有
|
中心
|
|
办公室 365
|
谷歌
|
|
投递箱
|
一个驱动器
|
|
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 请求
回复操作可能是最常见的HTTP 请求操作。此操作是只读操作,可以将数据带入 JMP。
Common messages for
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.
Common messages for
HTTP 请求
:
-
“方法”
-
“网址”
-
“形式”
-
“JSON”
-
“文件”
-
“Blob”
-
“发送”
图 6 展示了一个HTTP 请求“表单”数据。在 JSL 中, “表单”数据可以包含两个属性: “字段”和/或“文件” 。它们都是 JSL关联数组,将键映射到字符值或字符值列表。对于“文件” ,字符值或字符值列表就是要添加到“表单”的文件名。
Figure 6. “
HTTP 请求
邮政
using a
形式
”
图 7 展示了一个HTTP 请求“ JSON”数据。在 JSL 中, “JSON”可以是 JSON 格式的关联数组或字符数据。JSON Expr将创建一个定义明确的 JSON 对象,用于HTTP 请求。JSON 数据作为请求正文发送。 
Figure 7. “
HTTP 请求
邮政
using ‘
JSON'
”
图 8 展示了一个HTTP 请求“ File”数据。在 JSL 中, “File”是要作为请求主体发送的文件名。 
Figure 8. “
HTTP 请求
邮政
using ‘
文件'
”
HTTP 请求“ Blob”数据的最后一个操作。在 JSL 中, “Blob”是指要作为请求主体发送的二进制 Blob 数据。这意味着您无需在将文件作为请求的一部分发送之前将其写入磁盘。
这
得到
行动是最简单的请求,而
邮政
是最复杂的。
HTTP 请求
并且 Web 资源始终由服务器定义。尽管 HTTP 协议是一个定义明确的标准,但数据(和数据结构)却是基于每个 Web 资源定义的。也就是说,尽管 One Drive 和 Dropbox 的功能类似,但它们的 API 却有所不同。
退回寄件人
HTTP 请求“发送”消息中的数据可能是字符数据、二进制 Blob 数据或空数据,具体取决于 Web 资源。检查返回数据的“是否为空”是最粗略的数据调查级别(除了“无”之外)。但是,如果您需要更细粒度的调查,可以使用“是否为字符串”来检查字符数据。
对于更细粒度的调查,您可以使用“获取 MIME 类型” 。常见的 MIME 类型可以在本文参考部分的“MIME 类型不完整列表”一文中找到。
最后,如果需要,您可以使用以下消息调查来自 Web 资源的低级 HTTP 状态代码:
|
“有信息”
|
100-199
|
|
“成功了”
|
200-299
|
|
“有重定向”
|
300-399
|
|
“客户端出现错误”
|
400-499
|
|
“服务器错误”
|
500-599
|
|
“有错误”
|
客户端或服务器有错误
|
|
“获取状态”
|
HTTP 状态代码
|
HTTP 状态代码描述可以在本文参考部分的状态代码定义文章中找到。
在哪里使用它
尽管HTTP 请求能够处理来自任何 Web 资源的字符数据或二进制 Blob 数据,但我们将重点关注来自 RESTful 服务的字符数据,即 JSON 数据。
这很甜蜜
PubChem 是一家基于 HTTP 协议标准并采用 REST 架构的新型数据管理公司。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 图像”
Lactose 请求使用 PubChem 的终端节点获取化合物。这里还使用了两个额外的概念。第一个是URI 编码。URI 编码,也称为百分比编码,确保 RESTful URL 仅包含 ASCII 字符(幸运的是,Lactose 确实包含 ASCII 字符)。第二个概念是“获取 MIME 类型” 。此 PubChem 终端节点的返回值是二进制 blob 数据(PNG 图片)。 “获取 MIME 类型”检查确保 blob 在与 New Image 一起使用之前确实是 PNG 格式,因为如果未找到 PNG,此终端节点将返回字符数据。
要检索 JSON 数据中的乳糖完整记录, HTTP 请求如下所示:
图 14.“从 PubChem获取Lactose 的完整记录”
PubChem 定义的端点指定/JSON后缀表示 RESTful 服务应返回 JSON 数据,因此无需检查“数据”的 MIME 类型。但是,我们必须处理 JSON。有 [至少] 两种方法可以处理返回的“数据” 。第一种方法是使用“JSON To Data Table” 。这将尝试从“数据”创建 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 中的“道具”数据。然后,我们可以使用熟悉的 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 年,漫威漫画 (Marvel Comics) 创建了一项 RESTful 服务,允许用户访问 70 年来的漫画信息。漫威漫画 API 的功能仅受限于编剧的想象力,因此我当然需要注册一个密钥并使用它才能找到内容。我编写了一个marvel:API JSL 函数,它使用了各种列来爬取漫威宇宙的漫画信息。
作为死侍的粉丝,我提出了一个初始查询并创建了此数据表: 
图 18.“部分死侍数据表。”
这揭示了漫威漫画宇宙中四个不同的死侍角色。我对第一个角色的身份很感兴趣,因此选择了我创建的系列点击事件处理程序。根据点击的来源,奇迹:API函数可以向漫威发起新的查询,返回值可以说明死侍在漫威宇宙中的角色交叉点。我将结果限制为 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/