2017-11-01 2 views
1

APIを使用してデータを送信しようとしていますが、TypeErrorを取得しようとしています:バイトをstrに連結できません。これは私が理解していることは、コードの一部をバイトに変換する必要があることを意味しますが、これを行う方法がわかりません。私は前にbを追加しようとしました、またはバイト( 'データ')を使用していましたが、それらを間違った領域に置いているかもしれません。TypeError:strにバイトを連結できないときにバイトに変換する方法

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")) 

これは、問題の行である:私は何を、どのようにバイトに変換するか不明だ

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

+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 postも実行しません。これは私のペイロードデータに問題がありますか?またはサイト自体? – nvachhan

+0

何が返されますか? print( '{} {}'。format(res.status、res.reason)) 'を試して、応答の本文を表示してください。あなたが指定したURLにデータが投稿されることは確かですが、それを処理するのはサーバーの責任です。サーバーがこれらのフィールドを期待していると仮定して、ペイロードデータに問題はありません。ヘッダーは問題の可能性が高くなります。特に、content-type:multipart/form-dataヘッダーは、要求の本文を特定の方法でフォーマットする必要があります。 – mhawke

+0

@nvachhan:パブリックAPIを使用していますか、それともカスタムですか? – mhawke

関連する問題