🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

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

Q&A

2回答

4524閲覧

requestsを使い、スマレジAPIで顧客データを参照したい

yep.app

総合スコア11

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

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

0グッド

0クリップ

投稿2019/12/09 10:41

編集2019/12/11 16:48

前提・実現したいこと

PythonでスマレジAPIを操作し、
json形式のデータを取得したいと考えています。

発生している問題

proc_Nameという処理名がないため、不正パラメーターとなりエラーが発生しています。

試した事

  • https://smaregi.jp/で自分のアカウントを作成し、実験しています。
  • ソースで、proc_Nameを指定していますが、特にエラーメッセージに影響は見られなかったです。
  • プロセス名を指定したいため、requestsのドキュメントにあるproc_name --name customer_refとオプションをつけても結果は変わりませんでした。

エラーメッセージ

python

1#print(r.reason) 2Bad Request 3 4#print(r.content) 5b'{"error_code":15,"error":"\u51e6\u7406\u540d\u304c\u7121\u52b9\u3067\u3059\u3002","error_description":"\u30d1\u30e9\u30e1\u30fc\u30bf\u4e0d\u6b63\u3067\u3059\u3002(procName is empty)"}' 6#上記の翻訳 7b'{"error_code":15,"error":"処理名が無効です。","error_description":"パラメータ不正です。(procName is empty)"}' 8 9#urlエンコードする前 10http://webapi.smaregi.jp/access/?proc_Name=customer_ref&fields=customerCode&fields=lastName&fields=firstName&conditions=customerId&order=customerCode+desc&limit=100&table_name=Customer 11#paramsをurlエンコードした結果 12#print(r.url) 13http://webapi.smaregi.jp/access/?%7B%27proc_Name%27%3A%20%27customer_ref%27%2C%20%27fields%27%3A%20%5B%27customerCode%27%2C%20%27lastName%27%2C%20%27firstName%27%5D%2C%20%27conditions%27%3A%20%5B%7B%27customerId%27%3A%20%27213%27%7D%5D%2C%20%27order%27%3A%20%5B%27customerCode%20desc%27%5D%2C%20%27limit%27%3A%20100%2C%20%27table_name%27%3A%20%27Customer%27%7D

該当のソースコード

python

1#coding: utf-8 2import requests 3import urllib 4import json 5 6#ベーシック認証用 7user_name = "xxxxxxxxxxxxxxx@gmail.com" 8password = "xxxxxxxx" 9 10#アクセスするURL 11url = "http://webapi.smaregi.jp/access/" 12 13#paramsを定義 14params = { 15 "proc_Name":"customer_ref", 16 "fields":["customerCode","lastName","firstName"], 17 "conditions":[{"customerId":"213"}], 18 "order":["customerCode desc"], 19 "limit":100, 20 "table_name":"Customer" 21} 22 23#json分解不可を回避 24params = urllib.parse.quote(str(params)) 25 26#headerを定義 27headers = { 28"X-access-token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 29"X-contract-id": "xxxxxxxx", 30"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8" 31} 32 33#リクエストをPOST 34r = requests.post(url=url, params=params, headers=headers, auth=(user_name, password)) 35 36#結果を表示 37print(r.reason) 38print(r.content) 39print(r.url)

参考文献

「スマレジ APIのご紹介」のスライド

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

Mac OS X
requests==2.21.0
urllib3==1.24.1

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

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

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

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

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

Lhankor_Mhy

2019/12/10 04:27

『ソースでは、jsonでproc_Nameを指定していますが、無効になってしまいます。』とのことですが、JSONとはどれのことを指していますか?外部ファイルにあるのでしょうか? また、『無効になってしまいます』とは具体的には何が起きていますか?
yep.app

2019/12/10 17:29 編集

すみません。説明不足でした。`#paramsで指定`の部分で「json形式で記述」という事が言いたかった事でした。 paramsを定義の部分で`"proc_Name":"customer_ref",`と書いています。 しかし、この部分が動くのかは分からずに書いてしまっています、、、。 この箇所を加えたことによる変化を期待しましたが、特にエラーメッセージは変わりませんでした。
guest

回答2

0

自分の学習のためにサンプルコードを残しておきます。
以下https://web.postman.co/ にて行いました。
パラメータの送り方が問題でした

python

1import requests 2 3url = "https://webapi.smaregi.jp/access/" 4 5payload='proc_name={"物理名"}&params={"limit": 1, "page": 1, "table_name": "テーブル名"} 6headers = { 7 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 8 'Accept': 'application/json', 9 'X-contract-id': '{"契約ID"}', 10 'X-access-token': '{"アクセストークン"}', 11} 12 13response = requests.request("POST", url, headers=headers, data=payload) 14 15print(response.text) 16

追記
requests.post()での通信の場合
GET = params
POST = data
にてパラメータを付与するようです

参考記事
https://www.yoheim.net/blog.php?q=20170802

投稿2022/08/20 13:35

編集2022/08/20 13:47
TTT_AAAA

総合スコア4

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

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

0

python

1form = customer_ref, *params = { 2 "proc_Name":"customer_ref", 3 "fields":["customerCode","lastName","firstName"], 4 "conditions":[{"customerId":"213"}], 5 "order":["customerCode desc"], 6 "limit":100, 7 "table_name":"Customer" 8}

このコードでparamsに代入されるのは、['fields', 'conditions', 'order', 'limit', 'table_name']ですが、想定されているとおりですか?

そのため、

python

1form = urllib.parse.quote(str(params))

で代入される文字列は'%5B%27fields%27%2C%20%27conditions%27%2C%20%27order%27%2C%20%27limit%27%2C%20%27table_name%27%5D'ですが、これは想定通りですか?

投稿2019/12/10 04:37

Lhankor_Mhy

総合スコア36928

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

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

yep.app

2019/12/10 18:19 編集

paramsに代入される値としては、proc_Nameも入るのでは?と期待しています。 そのため、想定通りの処理ではありません、、、。 urllib.parse.quoteについては想定通りです。 スマレジAPIは「&」などの文字列を処理できないと聞いているため、 パースしています。 追記:参考文献としてスライドを載せました。
yep.app

2019/12/10 18:39

`params=`とシンプルにした結果、エラーメッセージに影響ありませんが、urlのパラメータが増えました。
yep.app

2019/12/11 17:13

特に意図はありません。 しかし、 params = urllib.parse.parse_qs(params) AttributeError: 'dict' object has no attribute 'decode' となってしまうため、urlencodeすると文字列になりました。
Lhankor_Mhy

2019/12/12 03:50

URLのクエリストリングとして文字列を渡すのであれば、一般的には"&key=value"の形にしなくてはいけないと思うのですが、それについて現状のコードはAPIの仕様に適合したリクエストになっているのですか? どうも、うまく伝わっていない感じがしますのではっきり書きますと、 params = urllib.parse.quote(str(params)) ↑この行が間違っていると思っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問