Leo Yeh's Blog

SAS 系統管理 (112)

教學目標

初步了解 SAS 透過 PROC HTTP 呼叫 REST API 的基本概念。

重點概念

首先企業客戶目前會期望使用透過 REST API 取得外部和內部的資料,而 SAS 程式語言就能夠透過 PROC HTTP 呼叫 REST API,所謂 PROC HTTP 主要是發出超文件傳輸協議 (HyperText Transfer Protocol,HTTP) 請求,而 SAS 9.4 和 SAS Viya 皆支援。此外目前許多 REST API 的輸入和輸出皆是以 JSON 格式為主,並且因為 JSON 是結構化資料的文字格式,所以我們能夠提供使用 LIBNAME 引擎進行解析,請注意必須採用 SAS 9.4 M4 之後的版本才有支援。

接著我們先透過 Python 以 Flask 輕量級網站應用程式框架建立支援 GET 和 POST 之 HTTP 方法的 REST API,這是一個簡單的待辦事項的範例,透過此 REST API 範例,我們將能夠很彈性的修改為企業內部系統所提供的 REST API 進行模擬測試。

建立 REST API 伺服器開發環境

1
2
3
4
5
$ pip install virtualenv
$ mkdir todo-api
$ cd todo-api
$ virtualenv flask
$ flask/bin/pip install flask

開發 REST API 伺服器

1
$ vi app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!flask/bin/python
from flask import Flask, jsonify, request, abort

app = Flask(__name__)

tasks = [
{
'id': 1,
'title': u'Learn Data Science',
'description': u'Data Science, Data Engineering, Data Analytics',
'done': False
},
{
'id': 2,
'title': u'Learn Artificial Intelligence',
'description': u'Artificial Intelligence, Deep Learning, Machine Learning',
'done': False
}
]

@app.route('/todo/api/v1.0/tasks', methods=['GET'])
def get_tasks():
return jsonify({'tasks': tasks})

@app.route('/todo/api/v1.0/tasks', methods=['POST'])
def create_task():
if not request.json or not 'title' in request.json:
abort(400)
task = {
'id': tasks[-1]['id'] + 1,
'title': request.json['title'],
'description': request.json.get('description', ""),
'done': False
}
tasks.append(task)
return jsonify({'task': task}), 201


if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)

啟動 REST API 伺服器

1
$ python app.py

再來當 REST API 伺服器之後,我們就能夠透過所熟悉的 SAS Enterprise Guide 客戶端工具撰寫 PROC HTTP 透過 HTTP GET 方法和 HTTP POST 方法呼叫 REST API 取得資料,請注意若我們要透過 HTTP POST 方法傳送 JSON 格式的輸入資料,則必須宣告「Content-Type」為「application/json」,否則將會導致 REST API 伺服器無法解析輸入資料,此外回傳的資料表主要根據 JSON 格式的輸出資料為主。

透過 HTTP GET 方法呼叫 REST API

1
2
3
4
5
6
7
8
9
10
11
12
filename resp TEMP;
proc http
method="GET"
url="http://api.server.com:5000/todo/api/v1.0/tasks"
out=resp;
headers
"Accept"="application/json";
run;
libname result JSON fileref=resp;
data work.api_data;
set result.tasks;
run;

透過 HTTP POST 方法呼叫 REST API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
filename resp TEMP;
proc http
method="POST"
url="http://api.server.com:5000/todo/api/v1.0/tasks"
in='{"title":"Learn REST API","description":"Python, SAS"}'
out=resp;
headers
"Accept"="application/json"
"Content-Type"="application/json";
run;
libname result JSON fileref=resp;
data work.api_data;
set result.task;
run;

最後 SAS 官方網站也提供許多有關 PROC HTTP 的範例程式,以利企業客戶參考範例程式解決使用 PROC HTTP 呼叫 REST API 所面臨的問題。

相關資源

⬅️ Go back