你如何编码 WIQL JSON?

How do You Encode WIQL JSON?

在 Postman 中,我可以毫无问题地向我们的 Azure DevOps 2019 服务器提交查询:

POST https://<AZDOSERVER>/<COLLECTION>/<PROJECT>/<TEAM>/_apis/wit/wiql?api-version=5.0
{"query": "Select [System.Id] From WorkItems WHERE [System.AreaPath] UNDER '<AREANAME>'"}

但是当我在 Python 中这样做时,它似乎 运行 出现编码问题,我的 AREANAME 周围有单引号。这是我的代码:

url = "https://<AZDOSERVER>/<COLLECTION>/<PROJECT>/<TEAM>/_apis/wit/wiql?api-version=5.0"
json = '{"query": "Select [System.Id] From WorkItems WHERE [System.AreaPath] UNDER ' 
    + "'<AREANAME>'" + '" }'
headers = {'Accept': 'application/json; api-version=5.0'}
response = request.post(url, json=json, auth=self.basicauth, headers=headers)

我收到 400 错误并显示以下消息:

b'{"count":1,"value":{"Message":"Error converting value \"{\"query\": 
\"Select [System.Id] From WorkItems WHERE [System.AreaPath] UNDER \'<AREANAME>\'\" }\" 
to type \'Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models.Wiql\'. Path \'\', 
line 1, position 92.\r\n"}}'

我应该如何将 JSON 正确地传递给 python request.post() 方法,以便它以正确的编码发送?我尝试通过 Fiddler 捕获我的出站请求,但它没有看到 python 流量。我也在安装 Wireshark,但这需要一段时间。我还通过 request.post 方法尝试了解它是如何构建请求主体的。当它覆盖到字节数组时,它似乎正确处理了单引号。

弄明白了:request.post() 为 json 参数取一个字典对象而不是 json 字符串。