質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Cisco

シスコ(Cisco Systems,Inc.)は、アメリカ合衆国に本社を置く、世界最大のコンピュータネットワーク機器開発会社及び同社の製品

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

704閲覧

PythonでvManageAPIのqueryをPOSTする際のアプローチ方法について

msy47

総合スコア26

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Cisco

シスコ(Cisco Systems,Inc.)は、アメリカ合衆国に本社を置く、世界最大のコンピュータネットワーク機器開発会社及び同社の製品

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2023/01/17 04:41

編集2023/01/17 04:42

前提

Lamda(python)でvManageへquery形式のデータをPOSTし結果を受け取りたい

SD-WAN vManage v20.10 - SD-WAN API Docs - Document - Cisco Developer
https://developer.cisco.com/docs/sdwan/#!sd-wan-vmanage-v20-10

Monitoring - BFD
POST
/statistics/bfd
<Stats query string>

{ "query": { "condition": "AND", "rules": [ { "value": [ "2020-05-10T01:00:00 UTC", "2020-05-10T01:30:00 UTC" ], "field": "entry_time", "type": "date", "operator": "between" }, { "value": [ "172.16.255.15" ], "field": "local_system_ip", "type": "string", "operator": "in" }, { "value": [ "172.16.255.16" ], "field": "remote_system_ip", "type": "string", "operator": "in" } ] }, "aggregation": { "field": [ { "property": "name", "sequence": 1 }, { "property": "proto", "sequence": 2 } ], "histogram": { "property": "entry_time", "type": "minute", "interval": 30, "order": "asc" }, "metrics": [ { "property": "latency", "type": "avg" }, { "property": "loss", "type": "avg" }, { "property": "loss_percentage", "type": "avg" }, { "property": "vqoe_score", "type": "avg" } ] } }

上記のようなQuery Stringが膨大なDataをPostする際
どのようなアプローチ方法があるのか相談と助言をいただきたく。

過去には以下のようなアプローチ方法を取っていました。

login_data = {`j_username` : vmanage_username, `j_password` : vmanage_password} login_url = base_url + login_action session = requests.session() login_response = session.post(url=login_url, data=login_data, verify=False) if login_token.status_code = 200: if b`<html>` in login_token.content: print("Login token Failed") exit(1)

Lamda(python)上で、RestAPIの実行結果を取得するプログラムを作成しています。
いくつかのAPIを実行し情報を取得する方法をとってきたが、
Query Stringが膨大なDataをPostする際のアプローチ方法について
知見がないため助言を頂きたい。

実現したいこと

  • POST /statistics/bfdで、膨大なData<Stats query string>を実行したい

発生している問題・エラーメッセージ

POST /statistics/bfdを実行する際
以下のようなQuery Stringをどのように読み込ませればよいのか検討がつかない状況

<Stats query string>
{ "query": { "condition": "AND", "rules": [ { "value": [ "2020-05-10T01:00:00 UTC", "2020-05-10T01:30:00 UTC" ], "field": "entry_time", "type": "date", "operator": "between" }, { "value": [ "172.16.255.15" ], "field": "local_system_ip", "type": "string", "operator": "in" }, { "value": [ "172.16.255.16" ], "field": "remote_system_ip", "type": "string", "operator": "in" } ] }, "aggregation": { "field": [ { "property": "name", "sequence": 1 }, { "property": "proto", "sequence": 2 } ], "histogram": { "property": "entry_time", "type": "minute", "interval": 30, "order": "asc" }, "metrics": [ { "property": "latency", "type": "avg" }, { "property": "loss", "type": "avg" }, { "property": "loss_percentage", "type": "avg" }, { "property": "vqoe_score", "type": "avg" } ] } }

該当のソースコード

過去に利用したPost方法

Lamda(python)

1 login_data = {`j_username` : vmanage_username, `j_password` : vmanage_password} 2 3 login_url = base_url + login_action 4 5 session = requests.session() 6 7 login_response = session.post(url=login_url, data=login_data, verify=False) 8 if login_token.status_code = 200: 9 if b`<html>` in login_token.content: 10 print("Login token Failed") 11 exit(1)

試したこと

POST /statistics/bfdを実行する際
以下のようなQuery Stringをどのように読み込ませればよいのか検討がつかない状況

補足情報(FW/ツールのバージョンなど)

Python3.9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2023/01/17 04:55

LamdaもvManageも知らないのですが、具体的に何が分からないのでしょうか? たとえば「~読み込ませればよいの~」というのは何をどこに読み込ませたいのでしょうか? また、仮に膨大ではない単純なQuery Stringの場合はどのようなコードになるのでしょうか。
msy47

2023/01/17 05:21

can110さん ご指摘・質問ありがとうございます。 分からない点は Query StringをどのようにPOSTのDataに渡してあげるのか、になります。 過去の試した事例としては POSTにcsvを渡してAPIを実行するという方法は理解できるのですが、 POSTにわたすDataがQueryの場合、どのように渡したらいいかがわからず 手を付けられていない状況になります。 サンプルを検証環境で実施した際には、以下のCrulが実行されておりました。 <Curl> crul -X POST "https://abc.com/dataservice/statistics/bfd" -H "accept:application/json" -H "Content-Type:application/json" -H "X-XSRF-TOKEN:(略)" -d "{/"query/":(略)}" 私の疑問としては、そもそもQueryをどうやってPOSTのDataにわたすのか、または渡すデータをcsvなどにして渡す方法があるのか(その場合Postの受け取り方法もわからず)、といった状況になります。 最終的には 1.POST+Queryを実行 2.受信結果をS3にアップロードする   または、csvに変換してS3にアップロードする ことを想定しております。
guest

回答1

0

ベストアンサー

curlでの方法を見る限り、jsonデータとしてPOSTしてあげればよいのであれば

More complicated POST requests

If you need that header set and you don’t want to encode the dict yourself, you can also pass it directly using the json parameter (added in version 2.4.2) and it will be encoded automatically:

と記載あるように、以下のような感じでjson=にデータを指定してあげればよいかと思います。

Python

1payload = {'query':()} # dict形式のデータ 2#payload = json.loads('{"query":(略)}') # json形式データなら 3headers = {'accept':'application/json', ...} # 何か必要なヘッダがあれば指定 4.post(, headers=headers, json=payload)

投稿2023/01/17 05:46

can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msy47

2023/01/18 04:00

can110さん ご助言ありがとうございます! 以下の通り修正したのですが、結果が表示されず ``` device_url = base_url + `/statistics/bfd` print(device_url) query_data = {`query`:{condition`:`AND`,`rules`:[{`value`:[`2023-01-01T01:00:00 UTC`,`2023-01-17T01:30:00 UTC`],(略) #query_data = json.loads{"query":{condition":"AND","rules":[{"value":["2023-01-01T01:00:00 UTC","2023-01-17T01:30:00 UTC"],(略) device_list = session.post(url=device_url, data=query_data, headers=headers_post, verify=False) #device_list = session.post(url=device_url, json=query_data, headers=headers_post, verify=False) print(device_list) if device_list.status_code = 200: json_data = device_list.json() else: print(device_list.status_code) df = pd.json_normalize(json_data["data"]) print(df) ``` 実行結果 いずのれPrintも表示されず ``` Response null ``` 以下のパターンを試してみました。 結果:Response Null ``` query_data = {`query`:{condition`:`AND`,`rules`:[{`value`:[`2023-01-01T01:00:00 UTC`,`2023-01-17T01:30:00 UTC`],(略) device_list = session.post(url=device_url, json=query_data, headers=headers_post, verify=False) ``` 結果:Response Null ``` query_data = {`query`:{condition`:`AND`,`rules`:[{`value`:[`2023-01-01T01:00:00 UTC`,`2023-01-17T01:30:00 UTC`],(略) device_list = session.post(url=device_url, data=query_data, headers=headers_post, verify=False) ``` 結果:Response Syntax error ※query_dataの行 ``` query_data = json.loads{"query":{condition":"AND","rules":[{"value":["2023-01-01T01:00:00 UTC","2023-01-17T01:30:00 UTC"],(略) device_list = session.post(url=device_url, json=query_data, headers=headers_post, verify=False) ```
can110

2023/01/18 04:06

「結果:Response Null」というのが具体的に何の結果なのか不明ですが Python実行時に例外など発生せず仮にステータスコードが200なのであれば通信部分は問題ないと思います。 あとはRestAPIの仕様にかんする部分だと思うので、なんともいえませんが。
msy47

2023/01/18 05:46

can110さん 伝え方がうまく説明できずすみません。 結果というのは、 Lamda関数画面の、コード>Execution resultsタブの 項目Responseになります。Nullしか表示されておりません。 また、CloudWatch側のログイベントでもErrorやPrintの結果は一切出力されていない状態となります。
msy47

2023/01/18 07:05

can110さん 失礼いたしました。 本質問としては回答を得ましたのでクローズします。 要件がPOSTでなくGETの可能性があるため再検証して出直します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問