devops 使用 Ajax 访问查询数据 WIQL

devops using Ajax access query data WIQL

我正在尝试使用 Ajax 访问 azure-devops 数据。下面是我的工作代码。

 $.ajax({
            url: 'https://dev.azure.com/ORG/products/_apis/wit/workitems/2065741?$expand=all&api-version=5.1',
            dataType: 'json',
            headers: {
                'Authorization': 'Basic ' + btoa("" + ":" + 'XXXX')
            }
        }).done(function( results ) {

        });

在我需要使用 WQIL 访问数据之后,它给出了意外的令牌错误。我想访问 WorkItem 和用户 activity。你能帮忙解决这个问题吗?

$.ajax({
            url: 'https://dev.azure.com/ORG/products/_apis/wit/wiql?api-version=5.1 ',
            dataType: 'json',
            headers: {
                'Authorization': 'Basic ' + btoa("" + ":" + 'XXXX')
            },
            JSON.Stringfy("QUERY":"SELECT     [System.Id],    [System.WorkItemType],    [System.Title],    [System.AssignedTo],    [System.State],    [System.Tags] FROM workitemLinks WHERE " +
    "(         [Source].[System.TeamProject] = @project        AND [Source].[System.WorkItemType] = 'User Story'      )     AND (         [System.Links.LinkType] = 'System.LinkTypes.Hierarchy-Forward'    ) "+
    " AND (         [Target].[System.TeamProject] = @project         AND [Target].[System.WorkItemType] = 'Task'     ) ORDER BY [System.Id] MODE (MustContain)")
        }).done(function( results ) {
         x=results
        });

您使用的前一个脚本是用于执行API的方法,但不适合执行WIQL脚本。这就是您遇到该错误的原因。

Ajax中执行WIQL实际上是一个request过程:wiql语句发送到你的服务器想要访问,请求执行查询语句(Wiql),return执行结果。因此,这是一个请求执行Post命令的过程。但是在你的脚本中,它并没有告诉服务器需要执行什么指令。

这里是一个简单的例子,可以参考 WIQLAjax:

<script type="text/javascript">
    $(document).ready(function () {
        $("#SelectWIT").on("click", function () {
            var d = { "query": " Select [System.Id] from WorkItems Where [System.WorkItemType] = 'Bug' "};
            $.ajax({
                type: 'POST',
                url: 'https://dev.azure.com/{org name}/{project name}/_apis/wit/wiql?api-version=1.0',
                contentType: 'application/json',
                data: JSON.stringify(d),
                cache: false,
                dataType: 'json',
                beforeSend: function (xhr) {
                    xhr.setRequestHeader("Authorization", "Basic " + btoa("" + ":" + "{PAT token}"));
                },
            }).done(function (data) {
                var items = [];
                $.each(data.workItems, function (key, val) {
                    items.push("<li> <a href='" + val.url + "'>" + val.id + "</a></li>");
                });

                $("<ul/>", {
                    html: items.join("")
                }).appendTo("body");
            }).error(function (e) {
                var s = "error error error";
            });
        })
    });
</script>

我的脚本的逻辑是向运行一个API请求一个WIQL语句作为请求体,将这个请求发送到我的项目想访问。然后将响应数据以 js 语法显示到页面正文中。这是输出:

因为我不确定你的下一个手术是什么。您可以在此脚本中将 Wiql 语句和 Url 替换为您的语句。然后改对应的done函数就可以实现你想要的了。

WQIL 以某种方式给出错误 400,这看起来像是权限问题。

所以我用不同的方式解决了它。除了查询,还有另一种方法可以提供工作项的所有详细信息,我只需要在其中传递工作项 ID。

 var d ={
  "ids": [
    20813,21677
  ],
  "fields": ["System.Id","System.WorkItemType","System.Title","System.AssignedTo","System.State","System.Tags"]
};
            $.ajax({
                type: 'POST',
                url: 'https://dev.azure.com/ORG/products/_apis/wit/workitemsbatch?api-version=5.1',
                contentType: 'application/json',
                data: JSON.stringify(d),
                cache: false,
                dataType: 'json',
                beforeSend: function (xhr) {
                    xhr.setRequestHeader("Authorization", "Basic " + btoa("" + ":" + "XXXXX"));
                },
            }).done(function (data) {
               x=data
            });