ラベル REST の投稿を表示しています。 すべての投稿を表示
ラベル REST の投稿を表示しています。 すべての投稿を表示

2024年2月13日火曜日

PROC HTTP で HTTPSではなくHTTPを使って通信するときのオプション

 最近はHTTPではなくHTTPSが当たり前に使われているが、内部の通信だとHTTPが使われていることがある。そのときに必要な PROC HTTPのオプションは、sslparms "SSLREQCERT"="ALLOW"; です。

マニュアルからこのSSLREQCERT=ALLOWの意味を引くと、「ALLOWは、クライアントがサーバ証明書を要求することを指定するが、証明書が提供されなかったり、無効な証明書が提供されたりしても、セッションは正常に進行する」です。PROC HTTPのデフォルトは、SSLREQCERT=DEMANDです。意味は「サーバ証明書が要求され、有効な証明書が提供されなければセッションが終了することを指定する」です。システムオプションでも設定できます。

よく curl、sas-viya CLIで --insecure, -k のオプションありますが。これは SSLREQCERT=NEVER と同じです。証明書のチェックはしません。ALLOWの方が証明書あり、無し、どちらでも対応できるので、例としてはALLOWが使われているのが多いと思います(推測)。

2024年1月17日水曜日

PROC HTTPでトークンを取得するサンプル

PROC HTTPでユーザ名とパスワードを指定してアクセストークンを取得するサンプルです。通常はOAUTH_BEARER=SAS_SERVICES を使うことが多いですが、稀にトークン取得したいというニーズがあります。このコードで?な箇所は認証のヘッダーにsas.cli:をエンコードした値を使っているところです。コロンの前がクライアントのツール、コロンの後にパスワードを指定するのが普通ですが、パスワードは空の状態でエンコードしています。このパラメータはSAS Viya CLIからauth loginするときに--verboseで出力されるデバッグの情報を見てそれに倣っています。クライアントのパスワードが空なのは理解できませんが、ログを見るとそうなっています。時間あるときにPostmanでも同じようにパラメータを指定して動くか確かめます。

/* PROC Sample of using HTTP to obtain an access token. */
%let client=sas.cli;
%let cpassword=;
%let username=alex;
%let password=hogehoge;
%let host=%sysget(SAS_SERVICES_URL);
filename resp "/tmp/foo.txt";

data _null_;
	attrib buf length=$64;
	buf=put("&client.:&cpassword.", $base64x64.);
	put buf=;
	call symputx('code', compress(buf), 'G');
run;

proc http method="POST" url="&host./SASLogon/oauth/token" 
		in="grant_type=password%str(&)username=&username.%str(&)password=&password." out=resp timeout=15;
	headers "authorization"="Basic &code" 
		"Content-Type"="application/x-www-form-urlencoded";
run;

data _null_;
	infile resp truncover;
	input;
	put _INFILE_;
run;

2022年10月12日水曜日

PROC HTTPのクエリパラメータのエンコーディング

クエリパラーメータを渡すときにエンコーディングが面倒だと思っていたら、PROC HTTPのQUERYのオプションで自動的にエンコードしてくれることに気が付いた。REST APIで日本語の名前でフィルタするときに使える。

%let name=%str(負荷テスト);
proc http url="https://%sysget(SAS_JOB_FLOW_SCHEDULING_SERVICE_HOST):443/jobFlowScheduling/flows" 
    query=("filter"="eq(name,'&name')")
    out=outjson oauth_bearer=sas_services;
  headers 'Accept'='application/vnd.sas.collection+json';
run;

2022年5月4日水曜日

SAS Viya CLI 入門 / SAS Viya REST API 入門

SAS Viya CLIの入門として資料を書き起こしました。CLIを使ってViyaのシステムを管理したい人向けです。内容を以下に示します。

  • SAS Viya CLIのインストール
  • プロファイル設定
  • プラグインを使った操作
  • OAuthプラグインでクライアントの登録
  • SAS Viya CLI + jq
  • curl + SAS Viya REST APIs
  • SAS Viya REST API 最初に見るポイント
時間があるときに以下の項目を足そうかと考えています。
  • SASコンテンツのフォルダ作成と権限の設定

いやいや、動いているのを見たいんだよと言う方は下の動画をご覧ください。




2022年4月8日金曜日

REST APIでViya4でジョブのステータス一覧を取得する

sas-viya CLIでジョブのステータス一覧を取るのは面倒です。なのでREST APIを使って一覧を作ります。サンプルのコードでは日付のフィルタ、ジョブの終了条件のフィルタ、日時で降順ソートして最大1000件のデータを取得しています。
前提としては sas-viya のCLIでprofile init, auth loginを実行済みであることです。
 
$ export ACCESS_TOKEN=$(cat ~/.sas/credentials.json | jq -r '.Default."access-token"')
$ export URL=https://viya4.example.com/jobExecution/jobs
$ curl -k "${URL}?limit=1000&filter=and(ge(creationTimeStamp,2022-04-07),ne(state,"completed"))&orderby=endTimeStamp" -H "Authorization: Bearer $ACCESS_TOKEN"   | jq -r '.items[] | [.state, .id, .jobRequest.name, .endTimeStamp, .creationTimeStamp, .modifiedTimeStamp, .elapsedTime, .createdBy, .modifiedBy, .error.message, .error.errorCode ]'
下が実行したときの画面イメージです。sas-viyaのCLIは困ったときに助かることも多いのですが、まとめてデータを取得するには不利です。curlとjqが使えればも応用の幅が広がります。

 

2022年3月14日月曜日

マクロ変数にURLのパラメータを設定する例

 SASでREST APIを使うときにアンパサンドのエスケープでしばし悩んだのメモしておきます。URLの後ろにクエリパラメータを書くときに必要になります。&はマクロ変数を展開するときの目印であるので、これが展開されないように工夫します。で、いろいろ試したのですが1回で代入ではなく、2回の代入と関数の組み合わせで動きました。1回の代入でとも思いますが、通常URLはベースの部分とパラメータの部分に分かれるので、変数を分けた方が可読性が良いです。

%nrstrで変数Yに割り当ててから、%strでもう一度変数Zに代入しています。


追記: クエリのパラメータは PROC HTTPのオプションの機能を使う方がスマートだと判りました。以下の記事を参照してください。
http://sasutility.blogspot.com/2022/10/proc-http.html

2021年11月26日金曜日

JSONのファイルをPROC HTTPで読み込む

SASでJSONのファイルを読み込むのは面倒かと思っていましたが、JSONエンジンとAUTOMAPオプションを使うと簡単にデータセットとして中身を見ることが出来ます。とりあえず読み込んでから中味を確認して、あとは用途に合わせて表形式に加工します。この例はViyaのジョブフローのスケジューリングの情報を取ってきます。
/* ジョブスケジューリングのJSONファイルとマップのファイルを定義 */
filename folders temp;
filename jsonmap temp;

/* JSONファイルを取得 */
proc http 
		url="https://henteko.azure.com/jobFlowScheduling/flows" 
		out=flows oauth_bearer=sas_services;
	headers 'Accept'='application/vnd.sas.collection+json';
run;

/* JSONファイルの先頭をログに出力して確認するだけ */
data _null_;
	infile flows;
	length buf $4096;
	input buf 1-4096;
	put _all_;
run;

/* JSONエンジンで読み込ませて、マップは生成 */
libname flows json fileref=folders map=jsonmap automap=replace;

/* 後はライブラリ参照名から要素と中身を見る */
proc print data=flows.items;
run;
自分でマップファイルを作らなくても、JSONエンジン任せで構造を読み解いて参照できるのはすごく楽です。下はJSONファイルを読み込んだ例で、もちろん中身の定義で見え方は異なります。