从Python调用IBM Watson的update_intent函数会产生“无效的请求主体”

时间:2017-12-13 11:55:56

标签: python ibm-watson

我在这种格式的python中有一个字典:

{
  "intents": [
    {
      "name": "ER111-Test1",
      "created": "2017-08-18T18:09:36.155Z",
      "updated": "2017-08-18T18:09:41.755Z",
      "description": null
    },
    {
      "name": "ER2222-Test2",
      "created": "2017-08-18T18:05:48.153Z",
      "updated": "2017-08-18T18:06:06.004Z",
      "description": null
    }
  ],
  "pagination": {
    "refresh_url": "/v1/workspaces/9978a49e-ea89-4493-b33d-82298d3db20d/intents?version=2017-08-21"
  }
}

我正在尝试删除“ER111”和“ER2222”值并重新上传。我从IBM Watson的API运行this方法。

代码99%有效,但不允许我在最后一步上传。

response = ...
names = [d['name'] for d in response['intents']]

for name in names:
  fixed_name = re.sub('ER\d{4,5}-', ' ', name) #this works to remove the prefix
  print(name + '  ' + fixed_name) #testing it works, it does
  response = conversation.update_intent(workspace_id='1234567',
                                        intent=str(name),
                                        new_intent=str(fixed_name)) #fails here with code 400

在最后一行,我们以“错误:无效的请求正文,代码:400”失败。如果我硬编码值而不是使用变量,它可以工作。我试过添加引号和其他一些东西,但似乎无法让它发挥得很好。

任何可能导致此问题的想法?

1 个答案:

答案 0 :(得分:1)

因此看起来Watson不喜欢您发送的数据中的前导空格。对于初学者,请看一下 -

fixed_name = re.sub('ER\d{4,5}-', ' ', name)
#                                  ^

由于nameER...开头,因此此模式将替换为前导空格。你应该做的是用空字符串''替换。

然而,更好的方法是使用-分割第一个str.split。这是如何 -

>>> "ER111-Test1".split('-', 1)[-1]
'Test1'