2

我正在尝试通过 API 发送数据,但收到 TypeError: can't concat bytes to str. 我理解这意味着我需要将部分代码转换为字节,但我不确定如何执行此操作。我尝试在前面添加 b 或使用 bytes('data') 但可能将它们放在错误的区域。

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)

我不确定什么以及如何转换为字节。

4

1 回答 1

3

requests如果可以的话,使用它会更容易使用。

否则,您需要urlencode将有效负载发布到服务器。有效载荷的 url 编码版本如下所示:

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

这是一个工作示例:

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 响应:

{
  “参数”:{},
  “数据”: ””,
  “文件”:{},
  “形式”: {
    "FilterId": "63G8Tg4LWfWjW84Qy0usld5i0f",
    “截止日期”:“2017-12-31”,
    “描述”:“测试1”,
    “禁用”:“真”,
    "exclusionRuleName": "排除",
    “名称”:“测试”,
    “类型”:“类型 1”
  },
  “标题”:{
    “接受编码”:“身份”,
    “缓存控制”:“无缓存”,
    “连接”:“关闭”,
    “内容长度”:“133”,
    “内容类型”:“应用程序/x-www-form-urlencoded”,
    "主机": "httpbin.org",
    “邮递员令牌”:“23c09c76-3b030-eea1-e16ffd48e9”,
    “X-Csrf-令牌”:“wWjeFkMcbopci1TK2cibZ2hczI”
  },
  “json”:空,
  “起源”:“220.233.14.203”,
  “网址”:“https://httpbin.org/post”
}

请注意,我使用httpbin.org作为测试服务器,发布到https://httpbin.org/post

另外,我已将 Content-type 标头更改为 application/x-www-form-urlencoded,因为这是 urlencode() 返回的格式。

于 2017-11-01T13:52:01.367 回答