2017-10-31 2 views
1

나는 예상대로 티피 링크의 URL (스마트 플러그 켭니다)와 인터페이스하는 의미와 작동합니다 다음 curl 명령이 있습니다호환성

curl --request POST "https://wap.tplinkcloud.com/?token=[token] HTTP/1.1" \ 
--data '{"method":"passthrough", "params": {"deviceId": "[deviceid]", "requestData": "{\"system\":{\"set_relay_state\":{\"state\":1}}}" }}' \ 
--header "Content-Type: application/json" 

이 예는 위의 예상 수행 등을 내 내비게이션 스마트 플러그가 켜집니다. 파이썬 요청에 번역하려고 할 때, 나는 이것을 사용하고 있습니다 :

url = "https://wap.tplinkcloud.com?token=[token] HTTP/1.1" 

data = "{\"method\":\"passthrough\", \"params\": {\"deviceId\": \"[deviceid]\", \"requestData\": \"{\\\"system\\\":{\\\"set_relay_state\\\":{\\\"state\\\":1}}}\" }}" 

headers = {'content-type': 'application/json', 'Accept-Charset': 'UTF-8'} 

r = requests.post(url, data=data, headers=headers) 
print r.text 

내 출력은 다음과 같습니다

{"error_code":-20651,"msg":"Token expired"} 

두 요청이 동일한 토큰 및 장치 ID를 사용하고 있습니다.

나는 둘 요청에 httpbin.org을 사용하고, 이것은 내가보고하고 비교입니다 :

말림 :

{ 
    "args": {}, 
    "data": "{\"method\":\"passthrough\", \"params\": {\"deviceId\": \"[deviceid]\", \"requestData\": \"{\\\"system\\\":{\\\"set_relay_state\\\":{\\\"state\\\":1}}}\" }}", 
    "files": {}, 
    "form": {}, 
    "headers": { 
    "Accept": "*/*", 
    "Connection": "close", 
    "Content-Length": "160", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.54.0" 
    }, 
    "json": { 
    "method": "passthrough", 
    "params": { 
     "deviceId": "[deviceid]", 
     "requestData": "{\"system\":{\"set_relay_state\":{\"state\":1}}}" 
    } 
    }, 
    "origin": "[myip]", 
    "url": "http://httpbin.org/post" 
} 

파이썬 : 뭔가 분명 내가

{ 
    "args": {}, 
    "data": "{\"method\":\"passthrough\", \"params\": {\"deviceId\": \"[deviceid]\", \"requestData\": \"{\\\"system\\\":{\\\"set_relay_state\\\":{\\\"state\\\":1}}}\" }}", 
    "files": {}, 
    "form": {}, 
    "headers": { 
    "Accept": "*/*", 
    "Accept-Charset": "UTF-8", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "160", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.18.4" 
    }, 
    "json": { 
    "method": "passthrough", 
    "params": { 
     "deviceId": "[deviceid]", 
     "requestData": "{\"system\":{\"set_relay_state\":{\"state\":1}}}" 
    } 
    }, 
    "origin": "[myip]", 
    "url": "http://httpbin.org/post" 
} 

있는가 내가 잘못 했니? 헤더 문제가있을 수 있습니까?

+1

는 "https://wap.tplinkcloud.com?token=[token] HTTP/1.1"그냥 곱슬 곱슬 예에서 일을하기 때문에 것을 사용 사실의 URL – Tomalak

+0

아니다. 그러나 그것을 제거하는 것은 아무런 효과가 없습니다. – Ryan

+1

글쎄, "Token expired"메시지는 꽤 명확합니다. 페이로드에 문제가 있다고 생각하지 않습니다. – Tomalak

답변

0

예, 확실하지 않은 것이 있습니다.

url = "https://wap.tplinkcloud.com?token=[token] HTTP/1.1" 

은 적절한 URL이 아닙니다. 그 HTTP/1.1 토큰의 일부로 해석됩니다.

일반적으로 JSON 문자열 리터럴을 사용하지 않는 것이 좋습니다. 해당 데이터 구조를 사용하고 데이터 전송 시점 (즉, HTTP 요청을하기 전이나 파일 또는 데이터베이스에 쓰기 직전)에 JSON으로 변환하십시오. 적어도 문자열에 불투명 한 구조적인 실수는 컴파일러 오류가됩니다.

URL 매개 변수에 대해서도 동일하게 적용되므로 적절한 인코딩은 requests 모듈에서 투명하게 처리됩니다.

import requests 
import json 

url = "https://wap.tplinkcloud.com" 
headers = {"Content-Type": "application/json", "Accept-Charset": "UTF-8"} 
params = {"token": "[token]"} 

request_data = {"system": {"set_relay_state":{"state":1}}} 
data = { 
    "method": "passthrough", 
    "params": { 
     "deviceId": "[deviceid]", 
     "requestData": json.dumps(request_data) 
    } 
} 

response = requests.post(url, params=params, data=json.dumps(data), headers=headers) 
print response.text 
+0

그래도이 오류가 발생합니다 :'TypeError : post()는 키워드 인자 'data'에 대해 여러 값을 가지고 있습니다. – Ryan

+0

Meh,'requests.post()'에서'params'를 kwarg로 만들 필요가 있습니다. 코드를 수정했습니다. – Tomalak

+0

그랬습니다. 고맙습니다! – Ryan