2017-03-29 2 views
0

私は、深く深く、私のapiスクリプトをPythonで処理しようとしています。私はちょうど何かが間違っているかどうか分からない、または私は投影セクションが書かれる方法を誤解しています。API - Python - リクエストライブラリ

私が提供する情報は次のとおりです。JSON経由またはsocketJS経由でAPIから情報を取得する方法は2つあります。ソケットJSコード私は本質的に同じことを行う底を提供します..

何が間違っているそれは正しくパラメータを処理していないようですが、私が得るすべては私と同じ値です私はフィルタや投影を追加していない..誰かが私が間違って何をしている上に任意のアイデアを持っていますか?私は要求ライブラリを正しく使用していないと思うが、私は見ているが、私はドキュメントの中で私の特定のケースで何かを見つけられないようだ。パイソンの外API-休憩経由

{ 
"address": "service", 
"body": { 
    "action": "getControlers", 
    "params": { 
     "filter": { 
      "deviceClass": { 
      "$like" : "*mainControllers*" 
     } 
     }, 
     "projection": { 
     "tagValues": { 
      "IdMap": 1, 
      "StateDevice": 1 
       } 

      }, 
     "limit":1000 
    } 

} 

}

同等の行::

ワーキングSocketJS

https://URLURL/rest/service/controlers?projection={"tagValues":{"StateDevice": 1}}&filter= {"DeviceClass": {"$like" : "*Controlers*"}} 

次のように私のスクリプトは次のとおりです。

import requests 
import json 
import os 

header = {"Authorization": 'access_token *Iputakeyheretomakethingswork*'} 

parameters = {"Filter": {"deviceClass": {"$like" : "*Controller*"}}, 

"Projection": {"tagValues":{"IdStateMap": 1, "stateDevice": 1}}} 

response = requests.get("https://urlgoeshere", headers=header, params=parameters) 
print(response.status_code) 

data = response.json() 

with open('data.txt', 'w') as outfile: 
    json.dump(data, outfile, sort_keys = True, indent = 4, 
      ensure_ascii = False) 

答えて

2

paramsはネストされた辞書構造をとっていません。 APIは本質的に、クエリ文字列にJSON形式の値を要求していますが、それらを提供していません。

さらに、例のURLは小文字ののパラメータ名を使用しています。辞書には大文字のパラメータが含まれています。

代わりに、requestsはURLエンコードでそれを符号化する前に、各要素を取ることによって文字列にparams内の任意のコンテナを変換します。辞書の場合、それはを意味し、キーのみが使用されます。;

>>> import requests 
>>> parameters = {"Filter": {"deviceClass": {"$like" : "*Controller*"}}, 
... "Projection": {"tagValues":{"IdStateMap": 1, "stateDevice": 1}}} 
>>> prepped = requests.Request('GET', 'http://example.com/', params=parameters).prepare() 
>>> prepped.url 
'http://example.com/?Filter=deviceClass&Projection=tagValues' 

以下はあなたのサンプルURLの同等生成します:あなたは、基本的に以下のURLを生産している私は、キーを小文字

parameters = { 
    "filter": '{"deviceClass": {"$like": "*Controller*"}}', 
    "projection": '{"tagValues": {"IdStateMap": 1, "stateDevice": 1}}' 
} 

注意をし、値ががちょうどを文字列です。必要であればあなたはPythonの辞書からこれらの文字列を生成するためにjson.dumps()機能を使用することができます。

import json 

filter = {"deviceClass": {"$like": "*Controller*"}} 
projection = {"tagValues": {"IdStateMap": 1, "stateDevice": 1}} 
parameters = { 
    "filter": json.dumps(filter), 
    "projection": json.dumps(projection), 
} 

デモ:

>>> parameters = { 
...  "filter": '{"deviceClass": {"$like" : "*Controller*"}}', 
...  "projection": '{"tagValues":{"IdStateMap": 1, "stateDevice": 1}}' 
... } 
>>> prepped = requests.Request('GET', 'http://example.com/', params=parameters).prepare() 
>>> prepped.url 
'http://example.com/?filter=%7B%22deviceClass%22%3A+%7B%22%24like%22+%3A+%22%2AController%2A%22%7D%7D&projection=%7B%22tagValues%22%3A%7B%22IdStateMap%22%3A+1%2C+%22stateDevice%22%3A+1%7D%7D' 
>>> from urllib.parse import urlparse, parse_qsl 
>>> parse_qsl(urlparse(prepped.url).query) 
[('filter', '{"deviceClass": {"$like" : "*Controller*"}}'), ('projection', '{"tagValues":{"IdStateMap": 1, "stateDevice": 1}}')] 
+0

恐ろしい、たくさん助けたと説明していただきありがとうございます。私はPythonでかなり新しいコーディングをしており、APIのために働いているので、学習曲線は険しい道です。 –

+0

haha​​ありがとう、私はそれを忘れてしまったので、私はあなたに投票しようとしたが、私はそれを行うのに十分な評判を得ていないと言う。 –

+1

これはあなたが[投票のための最低の評判](https://stackoverflow.com/help/privileges/vote-up)をまだ持っていないためです(しかし、今はおめでとうございます!)。 :-) –

関連する問題