【问题标题】:How to convert to bytes when TypeError: can't concat bytes to strTypeError时如何转换为字节:无法将字节连接到str
【发布时间】:2018-04-13 19:32:48
【问题描述】:

我正在尝试通过 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)

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

【问题讨论】:

  • 为什么不改用requests 模块?
  • 我在尝试使用时收到“ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED]”错误。认为这个问题可能比那更容易解决。
  • @nvachhan:exampleurl.com 的服务器没有有效的 SSL 证书。您可以仅使用 HTTP 进行测试,也可以尝试使用 httpbin.org,如我的回答所示。更好的是,按照建议使用requests
  • 我将使用请求中使用的代码发布另一个问题

标签: python python-3.x http.client


【解决方案1】:

如果可以,请使用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() 返回的格式。

【讨论】:

  • 您的代码确实有效,但我的网址无效,它实际上不是“exampleurl.com”。我的现在没有返回任何错误,但也没有执行 api post。这可能只是我的有效载荷数据的问题吗?还是网站本身?
  • 返回什么?尝试print('{} {}'.format(res.status, res.reason)) 并打印响应的正文。我确信数据将发布到您指定的任何 URL,但由服务器来处理它。假设服务器需要这些字段,您的有效负载数据没有任何问题。标头更可能是问题所在 - 特别怀疑是 content-type: multipart/form-data 标头,它要求以特定方式格式化请求的主体。
  • @nvachhan:您使用的是公共 API 还是自定义 API?
  • @nvachhan:无论如何。我想我已经回答了你原来的问题,所以你可以考虑接受它。
  • 这是自定义的,不是公共 API。我修改了你说的,得到了​​以下结果打印“401 Unauthorized”
猜你喜欢
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多