【问题标题】:TFS Code Search/Work Rest API return 404TFS 代码搜索/工作休息 API 返回 404
【发布时间】:2018-11-03 06:17:32
【问题描述】:

我们在本地使用 TFS。

TFS 版本: Microsoft Visual Studio Team Foundation Server 版本 16.122.27409.2 (2018)。

我们需要执行 TFS 源代码控制(代码搜索) 根据MS API documentation 这种方式使用 TFS REST API。 构建和发布 API 正在运行,但搜索 API 返回 404。 已从 TFS 门户安装搜索代码扩展并正常工作。

API 网址:

POST:http://{DNS}:8080/tfs/{Collection}/{Project}/_apis/search/codesearchresults?api-version=4.1-preview.1

结果:

请帮忙,我做错了什么?

【问题讨论】:

    标签: search tfs code-search azure-devops-rest-api


    【解决方案1】:

    您不能只在浏览器中打开它。您必须提供请求正文,如 API 示例中所明确表达的那样:

    {
      "searchText": "CodeSearchController",
      "$skip": 0,
      "$top": 1,
      "filters": {
        "Project": [
          "MyFirstProject"
        ],
        "Repository": [
          "MyFirstProject"
        ],
        "Path": [
          "/"
        ],
        "Branch": [
          "master"
        ],
        "CodeElement": [
          "def",
          "class"
        ]
      },
      "$orderBy": [
        {
          "field": "filename",
          "sortOrder": "ASC"
        }
      ],
      "includeFacets": true
    }
    

    【讨论】:

      【解决方案2】:

      正如丹尼尔所说的“You can't just open it in a browser. You have to provide a request body

      因此您可以使用Postman等工具发送带有请求正文的请求,也可以使用PowerShell调用带有请求正文的REST API。

      此外,根据我的测试,您提到的 REST API (Code Search Results) 似乎不适用于本地 TFS。我在 TFS 2018 Update2 (Version 16.131.27701.1) 上测试过,它总是返回 "count": 0,

      但是您可以使用下面的 REST API 来搜索代码:

      POST http://server:8080/tfs/DefaultCollection/{Project}/_api/_search/postCodeQuery?api-version=4.1-preview.1
      

      请求正文:

      {"searchText":"<test1>",
       "scope":"Team Foundation Server",
       "filters":"{\"ProjectFilters\":[\"0511ScrumTFVC\"]}",
       "skipResults":0,
       "takeResults":50,
       "sortOptions":""   
      }
      

      以下 PowerShell 示例供您参考:

      Param(
         [string]$baseurl = "http://server:8080/tfs/DefaultCollection",  
         [string]$projectName = "ProjectName",
         [string]$user = "username",
         [string]$token = "password"
      )
      
      # Base64-encodes the Personal Access Token (PAT) appropriately
      $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
      
      
      function CreateJsonBody
      {
      
          $value = @"
      
      {"searchText":"<test1>",
       "scope":"Team Foundation Server",
       "filters":"{\"ProjectFilters\":[\"ProjectName\"]}",
       "skipResults":0,
       "takeResults":50,
       "sortOptions":""   
      }
      
      "@
      
       return $value
      }
      
      $json = CreateJsonBody
      
      $uri = "$baseurl/$($projectName)/_api/_search/postCodeQuery?api-version=4.1-preview.1"
      Write-Host $uri
      $result = Invoke-RestMethod -Uri $uri -Method POST -Body $json -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
      
      $result = $result | convertto-json
      
      Write-host $result 
      

      【讨论】:

      • 嗨,安迪。感谢您的详细回复。但是我无法执行您描述的示例。我正在使用 Postman 和 PAT 身份验证。当我执行搜索请求时,我收到错误 500,所需的防伪表单字段“__RequestVerificationToken” 为了克服这个问题,我需要将 __RequestVerificationToken 作为表单而不是 json 请求发送。你知道为什么吗?可以是一些 TFS 服务器配置吗?
      • @PrimeNum "However I can't execute the example as you described" 是什么意思?当您运行 PS 脚本或任何其他问题时会出现什么错误?您是否为 PAT 设置了正确的范围?能否请您分享完整的错误消息或截屏,然后我们可以相应地进行故障排除。
      • 嗨,安迪。我正在尝试使用 Postman 执行 代码搜索。我在这里上传了一些详细的信息 [链接]drive.google.com/drive/folders/…。希望你能看看。
      • @PrimeNum 无法在我这边重现这个问题,一切都按预期工作。但是根据错误信息,您可以尝试enable cookies in your browser(在您的场景中为IE),并将TFS地址添加到信任站点,然后再次检查。
      猜你喜欢
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      相关资源
      最近更新 更多