Slack应用Manifest更新:curl转Python请求的实现疑问
解决Slack Manifest更新的Python requests实现问题
问题背景
用户有一个可正常运行的curl命令,用于更新Slack应用的Manifest:
curl -D /dev/stderr -s -d app_id=<APP_ID> --data-urlencode manifest@manifest.json -H 'authorization: Bearer <CURRENT_TOKEN>' https://slack.com/api/apps.manifest.update
尝试用Python3的requests库实现相同功能时,写出了以下代码:
import requests currentKey = <CURRENT_KEY> headers = { 'authorization': 'Bearer ' + currentKey, } data = { 'app_id': '<APP_ID>', } response = requests.post('https://slack.com/api/apps.manifest.update', headers=headers, data=data) print(response.text)
但运行后返回错误:
{"ok":false,"error":"invalid_arguments","response_metadata":{"messages":["[ERROR] missing required field: manifest"]}}
用户尝试过用json、urllib读取编码后传入data字典的方式均未成功,想知道正确的编码传递方法,是否需要使用requests的files参数。
解决方案
不需要使用files参数,因为curl里的--data-urlencode manifest@manifest.json是把manifest.json的内容读取出来,做URL编码后作为表单字段manifest的值传递,并非文件上传操作。
正确的实现步骤:
- 读取
manifest.json文件的全部内容 - 将内容添加到
data字典的manifest字段中 - 直接用
requests.post的data参数提交,requests会自动处理URL编码,和curl的行为一致
完整代码示例:
import requests currentKey = "<CURRENT_TOKEN>" app_id = "<APP_ID>" headers = { 'authorization': f'Bearer {currentKey}', } # 读取manifest文件内容 with open('manifest.json', 'r', encoding='utf-8') as f: manifest_content = f.read() data = { 'app_id': app_id, 'manifest': manifest_content } response = requests.post('https://slack.com/api/apps.manifest.update', headers=headers, data=data) print(response.text)
如果之前用urllib编码失败,可能是手动编码后重复编码导致的。直接把文件内容放到data字典里,让requests自动处理编码即可,这和curl的--data-urlencode行为完全匹配。
内容的提问来源于stack exchange,提问作者El_Birdo
相关产品推荐
相关产品推荐

