pythonを使ったrestAPIのお勉強

会社技術

はじめに

ここでは実践のみ。

準備

以下を持つアイテムを作成する
・名称
・リスト
・フィルターリスト
・アイテム参照
・アイテム関連付
変数名は記録しておく。

アイテムタイプ

プロパティ

サンプルアイテム

実践

AML編

こちらを参考に基本を学習する。

データ取得

ここではwhereで対象のアイテムを絞っている。
whereがないとすべてのアイテムが出力される。

<Item type="Test_Item_katsu" action="get" where="[Test_Item_katsu].name='aeiou'"></Item>

リレーションを取得するには<Relationships>が必要

<Item type="Test_Item_katsu" action="get" where="[Test_Item_katsu].name='あいうえお'">
<Relationships><Item type="Test_Item_katsu_Test_" action="get"></Item></Relationships>
</Item>

データ登録

アイテムを作成と既存アイテムを参照、リレーションを示す。参照や関連付けの場合は「get」を使う!タブで囲まれた値は""で囲まない

<Item type="Test_Item_katsu" action="add">
<name>aaa</name>
<list>001</list>
<item_item><Item type="Test_Item_katsu" action="get"><name>aeiou</name></Item></item_item>
<Relationships><Item type="Test_Item_katsu_Test_" action="add"><related_id><Item type="Test_Item_katsu" action="get"><name>aeiou</name></Item></related_id></Item></Relationships>
</Item>

データ編集

アイテムを編集する。Getのようにアイテムを指定して、作成時のように変えたいものを入れるが、リレーションについてはIDを取得しないとどうにもならなそう。<Relationships>以外は試してOKだった。deleteする場合は全IDを取得する必要があるのか。。

<Item type="Test_Item_katsu" action="edit" where="[Test_Item_katsu].name='bbb'">
<name>bbb</name>
<list>002</list>
<item_item><Item type="Test_Item_katsu" action="get"><name>あいうえお</name></Item></item_item>
<Relationships><Item type="Test_Item_katsu_Test_" action="delete" where="[Test_Item_katsu_Test_].related_id='******************'"></Item></Relationships>
</Item>

rest編

こちら(ブログ)こちら、(英語マニュアル)のRestAPIを参考に。

import requests
import json
import hashlib
import pandas as pd

###トークン関係のクラス###
class GetAccessToken:
    def __init__(self):
        self.baseURL = "" #
        self.database = "" #
        self.username = "" #
        self.password = "" #
        self.access_token = "" #

    def access_tokenn(self): #アクセストークンの取得
        #パスワードをMD5ハッシュ値へ変換
        oauth_password_hs = hashlib.md5(self.password.encode()).hexdigest()

        #OAuthServerURLの取得
        url = self.baseURL + "Server/OAuthServerDiscovery.aspx"
        response1 = requests.get(url)
        oauth_Server_URL = response1.json()["locations"][0]["uri"]

        #Token EndPointの取得
        url2 = oauth_Server_URL + ".well-known/openid-configuration"
        response2 = requests.get(url2)
        oauth_ServerToken_URL = response2.json()["token_endpoint"]

        #Tokenの取得
        payload = {'grant_type': 'password', 'scope': 'Innovator', 'client_id': 'IOMApp', 
                   'username': self.username, 'password': oauth_password_hs, 'database': self.database} #oauth_username
        response3 = requests.post(oauth_ServerToken_URL,  data=payload)
        self.access_token = response3.json()["access_token"]

###DBから情報を取得する関数(引数:テーブル名)###
def seach_info(data, baseURL=baseURL, header=header):
    tmp = requests.get(baseURL + "server/odata/{}".format(data), headers=header)
    return pd.DataFrame(tmp.json()["value"])

##ログイン準備##
baseURL = "http://192.168.0.101/InnovatorServer/"  #適宜
database = "****" #適宜
#ログインID
username = "admin" #適宜
#ログインパスワード
password = "innovator" #適宜

##トークンゲット##
token = GetAccessToken()
token.baseURL = baseURL
token.database = database
token.username = username
token.password = password
token.access_tokenn()
# print(token.access_token)

##トークンはヘッダーで扱う##
header={"Authorization":"Bearer " + token.access_token}

###getするとき###
#対象のITEM_Type
get_data="Test_Item_katsu" 
#どのアイテムの中身が欲しいか?
joken="?$filter=keyed_name eq 'abcdef'"
#抜き出したいプロパティは?
joken1="&$select=id, keyed_name, list" #複数条件は「,」
#参照アイテムの情報を見るときは?
joken2="&$expand=item_item" #アイテム参照

tmp=requests.get(baseURL + "server/odata/{0}".format(get_data+
                 joken+joken1+joken2), headers=header)

#リレーションを見るとき
joken3="&$expand=Test_Item_katsu_Test_($select=id, keyed_name, list)" #リレーション()がないと全部
tmp=requests.get(baseURL + "server/odata/{0}".format(get_data+
                 joken+joken1+joken3), headers=header)

#応用
joken4="&$expand=item_item($select=id, keyed_name, list), Test_Item_katsu_Test_($select=id, keyed_name, list)"
tmp=requests.get(baseURL + "server/odata/{0}".format(get_data+
                 joken+joken1+joken4), headers=header)

#filterで検索絞って、selectで表示を決め、expandで参照する。参照の表示範囲はfilterで上手く()で式を作る#

###post,patchするとき###
#対象のITEM_Type
get_data="Test_Item_katsu" 
#送るときのデータ
'''
json_data={
    "name":"abcdef",
    "list":"001",
    "item_item@odata.bind":"Test_Item_katsu('E9EAB55118714958930B5931C20ACB35')",    #item参照
    "Test_Item_katsu_Test_":[{                                                       #item関連
    'related_id@odata.bind':"Test_Item_katsu('E9EAB55118714958930B5931C20ACB35')"        
    }]
}
'''

##新規作成postのとき
#tmp=requests.post(baseURL + "server/odata/{0}".format(get_data), headers=header, json=json_data)

##編集patchのとき。「filterは使えない?」
#tmp=requests.patch(baseURL + "server/odata/{0}".format(get_data+"('EDF25C76A7C7479B93EE9B81EC72703F')"),
#                  headers=header, json=json_data)

print(tmp.json())

##以上 ARASのAPI##

感想

データベース側で色々機能をつけると改修が難しくなる。設備になるため。
外部で制御可能なものは自前で用意したほうがよいと思う。

コメント