python 请求:对天蓝色的 PUT 请求失败并出现 415 错误

Posted

技术标签:

【中文标题】python 请求:对天蓝色的 PUT 请求失败并出现 415 错误【英文标题】:python requests: PUT request to azure fails with 415 error 【发布时间】:2019-06-11 14:17:38 【问题描述】:

所以我尝试使用 python 请求向 Azure 发出 PUT 请求(创建/更新通知中心 - https://docs.microsoft.com/en-us/rest/api/notificationhubs/notificationhubs/createorupdate#mpnscredential。

我的代码:

url = "https://management.azure.com/subscriptions/mysub/resourceGroups/Default-NotificationHubs-WestEurope/providers/Microsoft.NotificationHubs/namespaces/myNamespace/notificationHubs/notificationHubName?api-version=2016-03-01"

bearer_token = "my very long token"

headers = 
    "dataType": "json",
    "accept":"application/json",
    "contentType":"application/json",
    "Authorization": "Bearer " + bearer_token 

filepath = "/Users/..../pathTo.p12"
    with open(filepath) as fh:
        byte_array_p12 = fh.read()

data = 
    'location': "West Europe",
    'properties.apnsCredential': 
        'properties.apnsCertificate': byte_array_p12,
        'properties.certificateKey': "some nice pass"
      


r = requests.put(url, data, headers = headers)

但是运行 r 给了我 415 错误。

r.text
u'"error":"code":"UnsupportedMediaType","message":"The content media type \'application/x-www-form-urlencoded\' is not supported. Only \'application/json\' is supported."'

\'application/x-www-form-urlencoded\' 是从哪里来的? 我正在为该请求明确设置标头,但不包括该标头...我一无所知。

我已经尝试了上述Azure页面上的“Try”功能,你可以尝试自己构建body,但是它有问题......

感谢您的帮助!

【问题讨论】:

旁注,有一个 SDK 可以避免处理低层:pypi.org/project/azure-mgmt-notificationhubs 【参考方案1】:

HTTP 标头应为Content-Type 而不是contentType

headers = 
    "dataType": "json",
    "accept":"application/json",
    "Content-Type":"application/json",
    "Authorization": "Bearer " + bearer_token 

另外,参数data 应该是 JSON 编码的。

r = requests.put(url, json=data, headers=headers)

【讨论】:

@Tobey 谢谢,这涵盖了 415 错误...我还必须使用 jsonpickle,bcs bytearray isnt json serializable...我现在得到的错误是:>>> r.text u '"error":"code":"InvalidRequestContent","message":"请求内容无效,无法反序列化:\'Could not find member\'properties.apnsCredential\' on object of type \' ResourceDefinition\'。路径 \'[\'properties.apnsCredential\']\',第 1 行,位置 56.\'."' 所以我必须以一种糟糕的方式构造 json ......任何人都知道在哪里看看如何将 properties.admCredential 转换为 json? 好吧,我接受了你的回答,@Tobey,因为它回答了我的问题。我无法让它运行,我放弃了请求,因为我不可能获得承载令牌(在上面的示例中,我使用了来自测试站点的一个,您可以尝试将请求放在一起),文档是至少可以说让我感到困惑......我现在正在尝试使用 python 库

以上是关于python 请求:对天蓝色的 PUT 请求失败并出现 415 错误的主要内容,如果未能解决你的问题,请参考以下文章

Postman请求发送—PUT&DELETE

JMeter中使用Put请求方式请求接口

WebAPI IIS PUT和DELETE请求失败

WebAPI IIS PUT和DELETE请求失败 405

MERN API 请求,不知道如何发出 put 请求并正确更新

如何发送一个PUT / DELETE请求jQuery的