Azure作业提交失败,400抱怨Etag

时间:2017-09-20 11:16:26

标签: rest azure-iot-hub

序言

我正在尝试使用Azure REST API,使用Python 2和requests包为Azure IoT中心创建“ScheduleUpdateTwin”作业。

分析

对请求的响应

我将从requests日志行开始(隐藏hubname):

DEBUG:urllib3.connectionpool:https://<myhubname>.azure-devices.net:443 "PUT /jobs/v2/j1505904104?api-version=2017-06-30 HTTP/1.1" 400 441

确实,req.status_code400

req.content是(稍微修改跟踪ID):

  

{“Message”:“ErrorCode:ArgumentInvalid;错误:BadRequest {\”Message \“:\”ErrorCode:ArgumentInvalid;作业类型ScheduleUpdateTwin的etag丢失或无效。 ScheduleUpdateTwin作业类型是强制更新,仅接受\'* \'作为Etag。\“,\”ExceptionMessage \“:\”跟踪ID:xxxxxxxxxx8844a48f81e29359ba0279-TimeStamp:09/20/2017 10:41:45 \“ }“,”ExceptionMessage“:”跟踪ID:xxxxxxxxxxe14888a51434047aef23d0-G:5-TimeStamp:09/20/2017 10:41:46“}

响应标头

{'Content-Length': '441',
 'Content-Type': 'application/json; charset=utf-8',
 'Date': 'Wed, 20 Sep 2017 11:10:12 GMT',
 'Server': 'Microsoft-HTTPAPI/2.0',
 'iothub-errorcode': 'ArgumentInvalid'}

请求标头

我的请求的标头(发送到Azure API端点)是(再次,破坏私有数据):

{'Accept': '*/*',
 'Accept-Encoding': 'gzip, deflate',
 'Authorization': 'SharedAccessSignature '
                  'sr=<myhubname>.azure-devices.net%2Fjobs&skn=<skn>&sig=<sig>&se=<se>',
 'Connection': 'keep-alive',
 'Content-Length': '227',
 'Content-Type': 'application/json',
 'If-Match': '*',
 'User-Agent': 'python-requests/2.18.1'}

请求正文

这是(在这里发布的漂亮照片,所以Content-Length会有所不同,显然)请求正文:

{
 "maxExecutionTimeInSeconds": 3600,
 "updateTwin": {
  "properties": {
   "desired": {
    "version": "5.0.0"
   }
  },
  "tags": {
   "owner": "tzot"
  }
 },
 "jobId": "j1505904104",
 "type": "scheduleUpdateTwin",
 "queryCondition": "deviceId = 'test_rpi_01'"
}

If-None-Match而不是If-Match

当然,应提供If-None-Match的{​​{3}} 提示,因为这是PUT。所以我改变了我的代码并发送了If-None-Match: *;响应再次为400

其他REST API调用正常

请注意,其他REST API调用(例如devices/{device_id})适用于GETPUTDELETE操作而没有设置Etag;同样适用于twins/{device_id}GETPATCH)和twins/{device_id}/methodsPOST)。

API版本

我使用的API版本是:api-version=2017-06-30

后记

如何通过REST API调用向Azure IoT提交作业?

更新

在请求JSON

中添加“etag”:“*”

在Rita Han的建议之后,我将"etag": "*"密钥添加到请求正文中,后者变为(注意:new jobId):

{
 "jobId": "j1505986505",
 "maxExecutionTimeInSeconds": 3600,
 "etag": "*",
 "updateTwin": {
  "properties": {
   "desired": {
    "version": "5.0.0"
   }
  },
  "tags": {
   "owner": "tzot"
  }
 },
 "type": "scheduleUpdateTwin",
 "queryCondition": "deviceId = 'test_rpi_01'"
}

结果相同:HTTP 400状态代码,响应中的内容相同。在HTTP请求标头中使用If-Match: *尝试,然后使用If-None-Match: *,然后使用If-None-Match: blabla,希望没有现有的ETag与“blabla”匹配。一切都无济于事。答案是一样的。

解决方案

内容应在etag值内包含updateTwin属性。

1 个答案:

答案 0 :(得分:1)

正如错误信息所指出的那样:

  

作业类型ScheduleUpdateTwin缺少或无效的etag。   ScheduleUpdateTwin作业类型是强制更新,仅接受   \'* \'作为Etag。

您可以像这样修改您的请求正文:

{
 "maxExecutionTimeInSeconds": 3600,
 "updateTwin": {
  "properties": {
   "desired": {
    "version": "5.0.0"
   }
  },
 "etag":"*",
 },
 "jobId": "j1505904104",
 "type": "scheduleUpdateTwin",
 "queryCondition": "deviceId = 'test_rpi_01'"
}

<强>更新

添加python测试结果:

enter image description here