웹 서비스 데이터 가져오기: JMP ® 14의 새로운 HTTP 요청(2018년 2월 231일자)
레벨: 중급
Bryan Boone, SAS의 JMP 수석 소프트웨어 개발자
정부와 민간 기관은 RESTful 서비스를 통해 인터넷을 통해 데이터를 제공하는 경우가 점점 더 늘어나고 있습니다. JMP 14에는 JSL을 통해 제공되는 HTTP 요청 이라는 새로운 기능이 추가되어 이러한 RESTful 서비스에 액세스할 수 있습니다. 본 백서에서는 RESTful 서비스의 정의와 HTTP 요청을 사용하여 JMP에 새로운 데이터를 가져오는 방법에 대한 몇 가지 예를 제공합니다.
REST란 무엇인가
REST(Representational State Transfer)는 인터넷상의 컴퓨터 시스템 간 상호 운용성을 제공하는 방식입니다. RESTful 서비스는 이 패러다임을 활용하는 웹 기반 서비스입니다. RESTful API는 HTTP 요청을 사용하여 데이터를 GET , POST , PUT , DELETE하여 RESTful 서비스와 상호 작용하는 애플리케이션 프로그램 인터페이스(API)입니다.
HTTP 프로토콜은 클라이언트가 서버에 리소스에 대해 수행하도록 요청하는 작업을 나타내는 일련의 요청 HTTP 메서드를 정의합니다. 이러한 메서드는 다음과 같습니다.
|
얻다
|
리소스 요청
|
|
머리
|
리소스 메타데이터만 요청합니다.
|
|
우편
|
리소스 수락 요청
|
|
놓다
|
리소스 저장 또는 생성 요청
|
|
삭제
|
리소스 삭제 요청
|
|
반점
|
리소스 상태 수정 요청
|
새로운 용어, 친숙한 활동
이는 완전히 새로운 개념처럼 보일 수 있지만, 여러분은 이미 가장 일반적인 두 가지 요청 방법인 얻다 와 편지를 알고 계실 것입니다.
얻다
얻다 에는 두 가지 성격이 있습니다.
첫 번째 성격은 단순히 리소스를 얻다(getda)는 것입니다. 즉, 의도는 단순히 웹 리소스에 접근하는 것입니다. 이는 그림 1에서 확인할 수 있습니다. 여기서 브라우저는 웹 페이지에 접근하고 있습니다. 
그림 1. “웹 리소스를 얻다 ”
두 번째는 리소스에 접근 하는 것(getda )과 쿼리 문자열을 함께 사용하는 것입니다. 쿼리 문자열은 웹 리소스에 의해 정의된 키/값 쌍의 집합으로, 클라이언트가 이러한 매개변수를 사용하여 서버에 GETda 요청을 필터링하거나 수정하도록 요청하는 데 사용됩니다. 그림 2에서 이를 확인할 수 있습니다. 여기서 브라우저는 다음을 사용하여 서버에 GETda 요청을 수정하도록 요청합니다.
우편
반면, 우편은 더 복잡합니다. 우편은 서버에 리소스를 변경하거나 생성하도록 요청합니다. 우편은 일반적으로 HTML 양식을 포함하며, 이 양식에는 문자 데이터의 키/값 쌍 및/또는 파일의 키/값 쌍 모음이 포함됩니다. 그림 3은 사용자를 Amazon에 로그인시키는 예입니다. 여기서 키/값 쌍은 다음과 같습니다.
|
이메일
|
이메일 로그인
|
|
비밀번호
|
귀하의 비밀번호
|
그림 3. “웹 리소스에 대한 우편 양식 데이터”
왜 사용해야 하나요?
HTTP 프로토콜은 정보 고속도로를 "고속도로가 포장되고, 도로 표지판이 설치되고, 다리가 건설되었다"라고 생각할 수 있게 해줍니다. 이 표준 덕분에 새로운 데이터 관리 회사가 생겨날 수 있었습니다. 또한, HTTP 표준의 도입으로 기존 회사에서 흔히 발견되는 정보 사일로가 제거되었습니다. 이러한 회사 중 일부는 다음과 같습니다.
|
Text-Processing.com(감정 데이터)
|
젠킨스
|
|
있다
|
허브
|
|
오피스 365
|
Google
|
|
드롭 박스
|
원드라이브
|
|
AWS(아마존 웹 서비스)
|
미국 인구조사국
|
|
안에
|
퍼브켐
|
|
뉴욕 타임스
|
핏빗
|
|
야후
|
비트코인
|
|
마블 코믹스
|
SAS
|
|
오픈AQ
|
제이엠피
|
사용 방법
JSON
JSON(JavaScript Object Notation)은 가벼운 데이터 교환 형식입니다. JavaScript 프로그래밍 언어의 하위 집합을 기반으로 합니다. JSON은 언어에 독립적인 텍스트 형식이지만 대부분의 프로그래머에게 이미 익숙한 개념을 사용합니다.
JSON은 두 가지 구조로 구성됩니다.
- 이름/값 쌍의 컬렉션입니다. (사전, 해시 테이블, 연관 배열 등)
- 값의 순서가 있는 목록입니다. (배열, 벡터, 목록, ...)
새로운 용어, 익숙한 활동(다시)
제이에스엘
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 요청이 웹 리소스를 JSL에 연결하는 접착제와 같다는 점입니다. 즉, HTTP 요청은 웹 리소스와 통신하여 스크립트 작성자가 JSL로 응답을 처리할 수 있도록 합니다. JSL의 복잡성은 작성자가 제어합니다.
웹 리소스와 상호 작용하는 동안 가장 일반적으로 사용하는 HTTP 메서드는 다음과 같습니다.
GET 작업에서 HTTP 요청 사용
얻다 액션은 아마도 가장 일반적인 HTTP 요청 액션일 것입니다. 이 액션은 JMP로 데이터를 가져올 수 있는 읽기 전용 액션입니다.
Common messages for
HTTP 요청
:
-
"방법"
-
“URL”
-
"쿼리 문자열"
-
"보내다"
Figure 4. “
HTTP 요청
얻다
”
HTTP 요청 얻다 액션에는 웹 리소스에 매개변수를 전송하기 위한 "쿼리 문자열" 이 함께 제공되는 경우가 많습니다. 그림 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 요청
:
-
"방법"
-
“URL”
-
"형태"
-
“제이슨”
-
"파일"
-
"얼룩"
-
"보내다"
그림 6은 HTTP 요청 " Form" 데이터를 보여줍니다. JSL에서 "Form" 데이터는 "Fields" 및/또는 "Files" 라는 두 가지 속성을 가질 수 있습니다. 두 속성 모두 키를 문자 값 또는 문자 값 목록 에 매핑하는 JSL 연관 배열 입니다. "Files" 의 경우, 문자 값 또는 문자 값 목록은 " Form"에 추가하려는 파일 이름입니다.
Figure 6. “
HTTP 요청
우편
using a
형태
”
그림 7은 HTTP 요청 " JSON" 데이터를 보여줍니다. JSL에서 "JSON"은 연관 배열 또는 JSON 형식의 문자 데이터일 수 있습니다. JSON Expr은 HTTP 요청 과 함께 사용할 명확하게 정의된 JSON 객체를 생성합니다. JSON 데이터는 요청 본문으로 전송됩니다. 
Figure 7. “
HTTP 요청
우편
using ‘
JSON'
”
그림 8은 HTTP 요청 " File" 데이터를 보여줍니다. JSL에서 "File"은 요청 본문으로 전송할 파일 이름입니다. 
Figure 8. “
HTTP 요청
우편
using ‘
파일'
”
HTTP 요청 " Blob" 데이터 처리에 대한 마지막 동작입니다. JSL에서 "Blob"은 요청 본문으로 전송하려는 바이너리 Blob 데이터입니다. 즉, 요청의 일부로 전송하기 전에 디스크에 파일을 쓸 필요가 없습니다.
그만큼
얻다
액션은 가장 간단한 요청입니다.
우편
가장 복잡합니다. 상호 작용은
HTTP 요청
웹 리소스는 항상 서버에 의해 정의됩니다. HTTP 프로토콜은 잘 정의된 표준이지만, 데이터(및 데이터 구조)는 웹 리소스별로 정의됩니다. 즉, One Drive의 API는 Dropbox와 유사하지만 기능은 다릅니다.
발신자에게 반송
HTTP 요청 " Send" 메시지의 데이터는 웹 리소스에 따라 문자 데이터, 바이너리 블롭 데이터 또는 비어 있는 데이터일 수 있습니다. 반환된 데이터에 대해 " Is Empty" 를 체크하는 것은 (아무것도 체크하지 않는 것 외에는) 가장 거친 수준의 데이터 조사입니다. 하지만 세밀한 조사가 필요하다면 " Is String"을 사용하여 문자 데이터를 확인할 수 있습니다.
더욱 세부적인 조사를 위해 "MIME 유형 가져오기"를 사용할 수 있습니다. 일반적인 MIME 유형은 본 문서의 참고 자료 섹션에 있는 "MIME 유형 미완료 목록" 문서에서 확인할 수 있습니다.
마지막으로, 필요한 경우 다음 메시지를 사용하여 웹 리소스의 저수준 HTTP 상태 코드를 조사할 수 있습니다.
|
“정보가 있습니다”
|
100-199
|
|
“성공적이다”
|
200-299
|
|
"리디렉션이 있습니다"
|
300-399
|
|
"클라이언트 오류가 있습니다"
|
400-499
|
|
"서버 오류가 있습니다"
|
500-599
|
|
"오류가 있습니다"
|
클라이언트 또는 서버 오류가 있습니다
|
|
"상태 가져오기"
|
HTTP 상태 코드
|
HTTP 상태 코드에 대한 설명은 해당 논문의 참고문헌 섹션에 있는 상태 코드 정의 문서에서 확인할 수 있습니다.
어디에 사용하나요?
HTTP 요청은 모든 웹 리소스의 문자 데이터 또는 바이너리 블롭 데이터를 처리할 수 있지만, 여기서는 RESTful 서비스의 문자 데이터, 즉 JSON 데이터에 중점을 둘 것입니다.
이것은 달콤하다
REST를 사용하는 HTTP 프로토콜 표준을 기반으로 설립된 새로운 데이터 관리 회사 중 하나가 PubChem입니다. PubChem은 2004년 미국 국립보건원(NIH)의 공개 화학 데이터 소스로 설립되었습니다. 대학, 제약 회사, 정부 기관, 화학 제품 공급업체 등 다양한 기관의 수백 개의 데이터 소스가 PubChem 레코드를 매달 업데이트하는 데 사용됩니다. PubChem은 공개적으로 이용 가능한 화학 정보 소스 중 가장 큰 규모를 자랑합니다.
PubChem은 데이터 쿼리를 물질, 화합물, 분석법 등으로 분류합니다. 이를 통해 관심 있는 다양한 속성, 설명, 복용량 및 기타 특성을 얻을 수 있습니다.
저는 그것을 M&M 재료라고 읽었습니다. 
그림 9. "플레인 M&M 재료"
플레인 M&M's의 성분을 JMP 데이터 테이블로 생성하는 JSL 스크립트를 작성했습니다. 그 성분에 인공 색소가 많이 들어 있다는 건 놀랄 일이 아니었습니다.
JMP 부분 데이터 테이블 표현은 다음과 같습니다. 
그림 10. “부분 플레인 M&M 성분 데이터 표”
JSL 스크립트가 실행되면 HTTP 요청을 사용하여 PubChem의 RESTful 서비스에서 제공하는 물질이나 화합물 이미지와 기타 속성을 검색합니다. 
그림 11. “PubChem 데이터가 포함된 부분 일반 M&M 성분 데이터 표”
관심 있는 RESTful 서비스 URL은 다음과 같습니다.
( [NAME] 은 그림 9와 10에 있는 물질 또는 화합물의 이름입니다.)
락토스와 같은 화합물의 이미지 데이터를 검색하려면 HTTP 요청은 다음과 같습니다. 
그림 12. “PubChem의 Lactose 이미지를 얻다 ”

그림 13. “PubChem에서 Lactose 이미지를
얻다 -ing하고 표시하기”
Lactose 요청은 PubChem의 화합물 엔드포인트를 사용합니다. 여기에는 두 가지 추가 개념이 사용됩니다. 첫 번째는 URI 인코딩 입니다. 퍼센트 인코딩이라고도 하는 URI 인코딩은 RESTful URL에 ASCII 문자만 포함되도록 합니다(다행히 Lactose는 ASCII 문자만 포함합니다). 두 번째 개념은 "MIME 유형 가져오기" 입니다. 이 PubChem 엔드포인트에서 반환되는 데이터는 PNG 그림과 같은 바이너리 블롭 데이터입니다. "MIME 유형 가져오기" 검사는 PNG가 없으면 이 엔드포인트가 문자 데이터를 반환하므로, 새 이미지와 함께 사용하기 전에 블롭이 실제로 PNG인지 확인합니다.
JSON 데이터에서 Lactose의 전체 레코드를 검색하려면 HTTP 요청은 다음과 같습니다.
그림 14. “PubChem에서 Lactose의 전체 기록을 얻다 ”
PubChem에서 정의한 엔드포인트는 /JSON 접미사가 RESTful 서비스가 JSON 데이터를 반환해야 함을 나타내므로 "data" 의 MIME 유형을 확인할 필요가 없습니다. 그러나 JSON을 처리해야 합니다. 반환된 " data"를 처리할 수 있는 방법은 [적어도] 두 가지가 있습니다. 첫 번째는 "JSON To Data Table"을 사용하는 것입니다. 이것은 "data" 에서 JMP 데이터 테이블을 만들려고 시도합니다. 직사각형 또는 표 형식 데이터의 경우 이 방법이 잘 작동합니다(그리고 빠릅니다). 그러나 모든 RESTful 서비스가 표 형식 데이터를 반환하는 것은 아닙니다(PubChem은 그렇지 않습니다). 반환된 데이터를 처리하는 두 번째 방법은 "Parse JSON" 입니다. 이것은 JSL 연관 배열을 만듭니다. 즉, JSON을 구문 분석할 필요가 없습니다. 그러나 반환된 데이터가 어떻게 구성되어 있는지 알아야 합니다. 즉, 키/값 쌍인지 또는 키/값 쌍인지 알아야 합니다. 원시 JSON을 JMP 로그에서 캡처하고 JSON 편집기를 사용하여 구조를 조사할 수 있으므로 생각보다 어렵지 않습니다.
Lactose에 대한 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 목록을 가져올 수 있습니다. 대부분의 " 소품"이 반복되므로 목록의 첫 번째 항목만 필요합니다.
"Props" 데이터는 JSL 연관 배열 이므로 JSON 형식으로 "props"를 JSON으로 다시 변환하여 JSON에서 Datatable로 사용할 수 있습니다. 결과는 그림 17과 같습니다. 
그림 17. “부분적 락토오스 특성 데이터 표”
HTTP 요청은 웹 리소스를 JSL에 연결하는 접착제일 뿐입니다. 데이터를 JSL로 가져오면 필요에 따라 간단하게든 복잡하게든 사용할 수 있습니다.
놀라운 것
2014년, 마블 코믹스는 사용자들이 70년간 축적된 만화 정보에 접근할 수 있는 RESTful 서비스를 만들었습니다. 마블 코믹스 API는 스크립터의 상상력에 의해서만 제한되기 때문에, 저는 키를 등록하고 직접 접근하여 원하는 정보를 찾아야 했습니다. 저는 마블 유니버스를 스파이더링하는 다양한 열을 사용하는 marvel:API JSL 함수를 작성했습니다.
저는 데드풀 팬이기 때문에 이 데이터 테이블을 생성하는 초기 쿼리를 실행했습니다. 
그림 18. "데드풀 일부 데이터 표."
이 연구는 마블 코믹스 유니버스에 등장하는 4명의 데드풀 캐릭터의 정체를 밝혀냈습니다. 첫 번째 캐릭터의 정체를 알고 싶어서 제가 만든 시리즈 클릭 이벤트 핸들러를 선택했습니다. 클릭의 출처를 고려하여, Marble:API 함수는 마블에 새로운 쿼리를 생성할 수 있으며, 반환값은 데드풀이 MCU에서 어떤 위치에 있는지 보여줍니다. 결과 행을 50개로 제한했지만, 몇 가지 흥미로운 결과를 발견했습니다. 데드풀의 인기 상승 및 하락(그리고 다시 상승) 시점을 확인하기 위해 " title" 과 "startYear" 에 대한 간단한 분포 분석을 수행했습니다.
그림 19. "부분적인 데드풀 분포."
그림 19는 2007년에 데드풀이 다음을 포함한 다양한 마블 코믹스 타이틀로 확장되었음을 보여줍니다.
- 어벤져스: 이니셔티브 (2007-2010)
- 케이블 & 데드풀
- 시빌 워: 엑스맨 유니버스.
데드풀에 대한 관심은 2007년 이후 다시 줄어들었지만, 라이언 레이놀즈가 엑스맨 오리진: 울버린(2009)에서 처음으로 데드풀 캐릭터를 연기한 후(분석에서 볼 수 있듯이) 다시 높아졌고, 2011년에 정점을 찍었습니다.
2012년~2015년, 마블 코믹스 유니버스는 데드풀 킬즈 더 마블 유니버스를 통해 마블 리부트를 통해 폭발적으로 성장했습니다.
마지막으로, 2016년부터 2018년까지는 놀랄 일이 없었습니다. 바로 그때 영화가 나왔으니까요.
데드풀 2의 피터는 마블 코믹스 API를 이렇게 요약했습니다. "방금 광고를 봤는데 재밌어 보이더라고요."
사용된 규칙
RESTful 서비스라는 용어는 웹 리소스가 REST 기반일 때 사용됩니다.
웹 리소스라는 용어는 일반적인 웹 접근을 의미할 때 사용되는 일반적인 용어입니다.
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일) https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods 에서 검색된 HTTP 요청 메서드
JSON.org(2017년 12월) https://www.json.org 에서 가져온 JSON 소개
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 에서 검색된 연관 배열 작업
https://curl.haxx.se/ 에서 검색된 URL을 사용하여 데이터를 전송하기 위한 CURL 명령줄 도구 및 라이브러리
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/ 에서 검색되었습니다.