2017-11-01 7 views
1

API를 통해 데이터를 보내려고하지만 TypeError가 발생합니다. 바이트를 str에 연결할 수 없습니다. 이것은 내가 이해하는 부분은 내 코드의 일부를 바이트로 변환해야하지만이 작업을 수행하는 방법은 확실하지 않습니다. 나는 앞에 b를 추가하거나 바이트 ('data')를 사용하려고했지만 잘못된 영역에 배치하려고했습니다.바이트로 변환하는 방법 TypeError : str에 바이트를 concat 할 수 없습니다.

conn.request("POST", "/api/campaign/create", payload, headers) 

내가 바이트에 무엇을 어떻게 변환 할 확실하지 오전 :

import http.client 

conn = http.client.HTTPSConnection("exampleurl.com") 

payload = { 
    'FilterId': "63G8Tg4LWfWjW84Qy0usld5i0f", 
    'name': "Test", 
    'description': "Test1", 
    'deadline': "2017-12-31", 
    'exclusionRuleName': "Exclude", 
    'disable': "true", 
    'type': "Type1" 
    } 

headers = { 
    'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", 
    'x-csrf-token': "wWjeFkMcbopci1TK2cibZ2hczI", 
    'cache-control': "no-cache", 
    'postman-token': "23c09c76-3b030-eea1-e16ffd48e9" 
    } 


conn.request("POST", "/api/campaign/create", payload, headers) 


res = conn.getresponse() 
data = res.read() 

print(data.decode("utf-8")) 

문제의 라인입니다.

+0

대신'requests' 모듈을 사용하지 않으시겠습니까? –

+0

사용하려고 할 때 'ssl.SSLError : [SSL : CERTIFICATE_VERIFY_FAILED]'오류가 발생합니다. 이 문제는 해결하기가 더 쉽다고 생각됩니다. – nvachhan

+0

@nvachhan : https://exampleurl.com의 서버에 유효한 SSL 인증서가 없습니다. HTTP로만 테스트하거나 내 답변에 표시된대로 [httpbin.org] (http://httpbin.org)를 사용해 볼 수 있습니다. 더 나은 방법으로,'requests'를 제안대로 사용하십시오. – mhawke

답변

2

가능한 경우 requests을 사용하십시오. 작업하기가 훨씬 쉽습니다.

그렇지 않으면 서버에 게시 할 페이로드가 urlencode이어야합니다. 여기

 
description=Test1&exclusionRuleName=Exclude&FilterId=63G8Tg4LWfWjW84Qy0usld5i0f&deadline=2017-12-31&type=Type1&name=Test&disable=true 

를 작동하는 예는 다음과 같습니다 : 귀하의 페이로드의 URL 인코딩 된 버전은 다음과 같습니다

import http.client 
from urllib.parse import urlencode 

conn = http.client.HTTPSConnection("httpbin.org") 

payload = { 
    'FilterId': "63G8Tg4LWfWjW84Qy0usld5i0f", 
    'name': "Test", 
    'description': "Test1", 
    'deadline': "2017-12-31", 
    'exclusionRuleName': "Exclude", 
    'disable': "true", 
    'type': "Type1" 
    } 

headers = { 
    'Content-Type': 'application/x-www-form-urlencoded', 
    'x-csrf-token': "wWjeFkMcbopci1TK2cibZ2hczI", 
    'cache-control': "no-cache", 
    'postman-token': "23c09c76-3b030-eea1-e16ffd48e9" 
    } 

conn.request("POST", "/post", urlencode(payload), headers) 

res = conn.getresponse() 
data = res.read() 

print(data.decode("utf-8")) 

http://httpbin.org 반환이 JSON 응답 : 나는 httpbin.org을 사용하고

 
{ 
    "args": {}, 
    "data": "", 
    "files": {}, 
    "form": { 
    "FilterId": "63G8Tg4LWfWjW84Qy0usld5i0f", 
    "deadline": "2017-12-31", 
    "description": "Test1", 
    "disable": "true", 
    "exclusionRuleName": "Exclude", 
    "name": "Test", 
    "type": "Type1" 
    }, 
    "headers": { 
    "Accept-Encoding": "identity", 
    "Cache-Control": "no-cache", 
    "Connection": "close", 
    "Content-Length": "133", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "Postman-Token": "23c09c76-3b030-eea1-e16ffd48e9", 
    "X-Csrf-Token": "wWjeFkMcbopci1TK2cibZ2hczI" 
    }, 
    "json": null, 
    "origin": "220.233.14.203", 
    "url": "https://httpbin.org/post" 
} 

주 테스트 서버로 https://httpbin.org/post에 게시합니다.

또한 urlencode()에 의해 반환 된 형식이기 때문에 Content-Type 헤더를 application/x-www-form-urlencoded로 변경했습니다.

+0

코드가 제대로 작동하지만 내 URL은 실제로 'exampleurl.com'이 아닙니다. Mine은 오류를 반환하지 않지만 API 게시물을 실행하지 않습니다. 이것이 페이로드 데이터에 문제가 될 수 있습니까? 아니면 사이트 자체? – nvachhan

+0

반환되는 항목은 무엇입니까? print ('{} {}'. format (res.status, res.reason))'를 시도해보고 응답 본문을 출력하십시오. 데이터가 지정된 URL에 게시되지만 서버를 처리하는 것은 서버의 책임입니다. 서버가 해당 필드를 예상한다고 가정 할 때 페이로드 데이터에는 아무런 문제가 없습니다. 헤더가 문제가 될 가능성이 더 높습니다. 특히 요청의 본문을 특정 방식으로 형식화해야하는 'content-type : multipart/form-data' 헤더가 의심 스럽습니다. – mhawke

+0

@nvachhan : 공개 API를 사용하고 있습니까? 아니면 맞춤 설정입니까? – mhawke