2017-03-29 1 views
0

저는 파이썬으로 내 api 스크립트를보다 깊고 깊게하려고 애를 썼습니다. 내가 뭔가 잘못하고 있는지 잘 모르겠다. 그렇지 않으면 프로젝션 섹션을 쓰는 방법을 오해하고있다.API - Python - Request Library

다음은 내가 제공 할 정보입니다. JSON 또는 socketJS를 통해 API에서 정보를 가져 오는 두 가지 방법이 있습니다. 소켓 JS 코드 난 기본적으로 동일한 일을 하단을 제공 할 것입니다 ..

무엇이 잘못되고 그것이 올바르게 매개 변수를 처리하는 것하지 않는 것입니다, 내가 얻을 수있는 같은 값입니다 나는 필터 또는 투영을 추가했습니다 ... 누구든지 내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까? 나는 요청 라이브러리를 올바르게 사용하지 않는다고 생각하지만, 나는 보았고 문서에서 나의 특별한 경우에 대해서는 아무것도 찾지 못하는 것 같다.

작업 SocketJS :

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

      }, 
     "limit":1000 
    } 

} 

}

파이썬의 외부 API 받침대를 통해

해당 라인 :

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}}' 
} 

참고하고 값이 그냥을 문자열입니다. 필요가있을 경우 파이썬 사전에서 해당 문자열을 생성하는 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

최고, 많이 도움과 설명에 감사드립니다. 저는 파이썬에서 상당히 새로운 코딩을하고 API를 사용하기 때문에 학습 곡선이 울퉁불퉁 한 도로였습니다. –

+0

하하 덕분에, 나는 또한 stackoverflow에 새로운 것을 잊어 버렸으므로, 나는 당신을 투표하려고 시도했지만, 나는 그렇게하기에 충분한 평판을 얻지 못했다고 말한다. –

+1

아직 [투표에 대한 최소 평판] (https://stackoverflow.com/help/privileges/voteup)을받지 못했기 때문에 (하지만 축하합니다!). :-) –