如何修复 python POST 对 Twilio 请求的“不支持的媒体类型”错误

How to fix 'Unsupported media type" error on python POST request to Twilio

我一直在关注 Twilio 的 Quickstart page for their Functions API

我卡在了应该手动上传函数JS文件的部分。

他们的 POST 示例使用 cURL 和 node.js 但我使用的是 Python 3.6:

# Manually upload the subscription function file
upload_url = f'https://serverless-upload.twilio.com/v1/Services/{sub_service_sid}/Functions/{sub_function_sid}/Versions'
function_request = requests.post(
                                upload_url,
                                files    = {'subscription_function_file': open('subscriptionFunction.js', 'rb')},
                                auth     = (account_sid, auth_token),
                                headers  = {
                                    'content-type': 'application/javascript',
                                    'path': '/subscription-function',
                                    'visibility': 'public'
                                }
                            )

在这两个示例中,它们都将内容类型声明为 application/javascript。但是,当我这样做时出现此错误:

{"status":415,"message":"Unsupported media type","detail":"The server does not support the media type transmitted in the request.","code":20415,"moreInfo":"https://www/twilio.com/docs/errors/20415"}

那个 URL 抛出一个 404 所以我去挖掘 Twilio 的 Error Dictionary but that code is not listed. Furthermore, application/javascript is absent from their supported media types 页面。

我上传的文件有误吗?还是他们的教程错了?

这里是 Twilio 开发人员布道者。

我认为您可能已将某些 curl 请求翻译成使用 requests 发出的请求的错误部分,我认为这是导致问题的原因。您不希望将请求类型设置为 application/javascript 想要成为您正在上传的文件的类型。您可以将其设置为 files 元组的一部分。

您不想发送其他数据位,PathVisibility 也作为 headers,它们应该是 data 的一部分,所以它们成为请求的一部分 body.

试试这样的方法:

upload_url = f'https://serverless-upload.twilio.com/v1/Services/{sub_service_sid}/Functions/{sub_function_sid}/Versions'

files = { 'Content': ('subscriptionFunction.js', open('subscriptionFunction.js', 'rb'), 'application/javascript') }

function_request = requests.post(
                                upload_url,
                                files    = files,
                                auth     = (account_sid, auth_token),
                                data     = {
                                    'Path': '/subscription-function',
                                    'Visibility': 'public'
                                }
                            )

如果有帮助请告诉我。