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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Python 3.x

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

Q&A

解決済

2回答

662閲覧

リクエストURLに余分な文字が入ってします

Kentaro0919

総合スコア258

Python 3.x

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

0グッド

0クリップ

投稿2017/10/19 09:20

編集2017/10/20 02:40

API にリクエストを送るのに パラメーターをつけてリクエストを出したいのですが、余分な文字列
「%22」が入ってしまい、エラーになってしまいます。

python

1def setParameters(s, d=maya.when("1 month ago")): 2 """set Parameters for make usage call to API.""" 3 print(s, d) 4 return {"year": d.year, "month": d.month, "billingDayOnly": True, "statisticName": s} 5 6def getListUsageperContract(contractId, productId, parameters): 7 """measures{?billingDayOnly,fromMonth,fromYear,month,statisticName,toMonth,toYear,year}""" 8 path = f"/billing-center-api/v2/contracts/{contractId}/products/{productId}/measures" 9 data_string = parse.urlencode({p: json.dumps(parameters[p]) for p in parameters}) 10 result = s.get(parse.urljoin(BASEURL, path), params=data_string) 11 return result 12

結果 https://example.com/api/v2/contracts/{contractId}/products/{productId}/measures?year=2017&month=8&billingDayOnly=true&statisticName=%22Total+MB%22

python

1def setParameters(s, d=maya.when("1 month ago")): 2 """set Parameters for make usage call to API.""" 3 print(s, d) 4 return {"year": d.year, "month": d.month, "billingDayOnly": True, } 5 6parameters = setParameters() 7 8parameters["statisticName"] = s 9

でも同じように余分な「%22」が入ってしまいます。

"statisticName": s を抜いたばいいうまく結果がでるので 該当箇所はここだと特定できているのですが、
ドキュメントのサンプリには該当箇所が 「statisticName=Total+MB」のようになっているので、「%22」
を取り除きたいのですが、どのように直したらいいでしょうか。

最終

python

1def setParameters(s, d=maya.when("1 month ago")): 2 """set Parameters for make usage call to API.""" 3 return {"billingDayOnly": "true", "statisticName": f"{s}","month": d.month, "year": d.year, } 4 5def getListUsageperContract(contractId, productId, parameters): 6 """measures{?billingDayOnly,fromMonth,fromYear,month,statisticName,toMonth,toYear,year}""" 7 path = f"/billing-center-api/v2/contracts/{contractId}/products/{productId}/measures" 8 data_string = parse.urlencode(parameters) 9 result = s.get(parse.urljoin(BASEURL, path), params=data_string) 10 return result 11

parse.urlencode を直接読み込むと"billingDayOnly": True =>?billingDayOnly=True になってしまいエラーになったので 文字列 "true" にするとうまくいきました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

{p: json.dumps(parameters[p]) for p in parameters}によって、ディクショナリ内の文字列値"Total+MB"のように前後に"が付加されているようです。
提示コード中のparse.urlencodeurllib.parse.urlencodeであるならば
parse.urlencode(parameters)のようにparametersをそのまま渡してよいと思います。

ちなみに当方環境ではTotal+MB中の+%2Bにエンコードされます。

Python

1import urllib.parse 2import json 3 4s = 'Total+MB' 5parameters = {"year": 2017, "month": 8, "billingDayOnly": True, "statisticName": s} 6print(parameters) 7# {'billingDayOnly': True, 'month': 8, 'year': 2017, 'statisticName': 'Total+MB'} 8 9dic = {p: json.dumps(parameters[p]) for p in parameters} 10print(dic) 11# {'billingDayOnly': 'true', 'month': '8', 'year': '2017', 'statisticName': '"Total+MB"'} 12 13ret = urllib.parse.urlencode(dic) 14print(ret) 15# billingDayOnly=true&month=8&year=2017&statisticName=%22Total%2BMB%22 16 17ret = urllib.parse.urlencode(parameters) 18print(ret) 19# billingDayOnly=True&month=8&year=2017&statisticName=Total%2BMB

投稿2017/10/19 09:56

編集2017/10/19 10:00
can110

総合スコア38252

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

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

Kentaro0919

2017/10/20 02:27

おかげさまでうまくいきました、指定しないと、だらだらすべてのパターンが返ってくるので、処理が 1/4にできます。 ```python def getListUsageperContract(contractId, productId, parameters): """measures{?billingDayOnly,fromMonth,fromYear,month,statisticName,toMonth,toYear,year}""" path = f"/billing-center-api/v2/contracts/{contractId}/products/{productId}/measures" data_string = parse.urlencode(parameters) result = s.get(parse.urljoin(BASEURL, path), params=data_string) return result ``` どうもありがとうございました。
guest

0

もともとの s に、"Total MB" と、前後を、" で囲んだ状態のデータが渡ってきてませんか。
%22 は英数字以外を表現するための記法で、% の後に文字コードが入ります。
%22 = " です。

投稿2017/10/19 09:24

tacsheaven

総合スコア13703

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

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

Kentaro0919

2017/10/20 02:28

そうなんです 入れてるつもりじゃないのに””が入っちゃうんです ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問