太棒了!我們終於成功突破最困難的部分了! 「成功找出11個工作項目」代表整個查詢的核心邏輯已經完全正確。 現在遇到的這個新問題,是一個非常常見且容易解決的 API 使用規則錯誤。 核心診斷 (非常明確) 伺服器的回應訊息已經把原因說得一清二楚: "the expand parameters can not be used with the fields parameter" 翻譯過來就是:$expand 和 fields 這兩個 URL 參數,在同一次 API 請求中不能同時使用。您必須從中二選一。 讓我們看一下出錯的函式 GetWorkItemDetailsAsync 中的這行程式碼: Dim detailsUrl = $"{organizationUrl}/_apis/wit/workitems?ids={idsString}&fields={fields}&`$expand=all&api-version=7.0" 您可以看到,我們的 URL 確實同時包含了 &fields=... 和 &$expand=all。 解決方案 (移除其中一個) 我們當初的目的是: * 用 fields 來指定只獲取我們需要的欄位 (提高效率)。 * 用 $expand=all 來確保 System.AssignedTo 欄位會展開成包含使用者 Email 的完整物件。 好消息是,在較新的 API 版本中,當您在 fields 參數中明確指定了 System.AssignedTo 時,API 預設就會回傳完整的物件,這使得 &$expand=all 變得多餘且衝突。 因此,最簡單、最正確的解決方案就是移除 &$expand=all。 精準的程式碼更新 請用以下版本完整取代您現有的 GetWorkItemDetailsAsync 函式。 ' ========================================================================= ' ▼▼▼▼▼▼▼▼▼▼▼ 請用這段【修正版】的 GetWorkItemDetailsAsync 函式 ▼▼▼▼▼▼▼▼▼ ' ========================================================================= Private Async Function GetWorkItemDetailsAsync(ids As List(Of Integer)) As Task(Of List(Of WorkItemDetail)) Dim idsString = String.Join(",", ids) Dim fields = "System.Id,System.Title,System.State,System.AssignedTo,Microsoft.VSTS.Scheduling.TargetDate" ' 【關鍵修改】我們移除了衝突的 "&$expand=all" 參數 Dim detailsUrl = $"{organizationUrl}/_apis/wit/workitems?ids={idsString}&fields={fields}&api-version=7.0" Console.WriteLine($"[DEBUG] 正在 GET 工作項目詳情 URL: {detailsUrl}") Using response = Await httpClient.GetAsync(detailsUrl) Dim responseBody = Await response.Content.ReadAsStringAsync() If Not response.IsSuccessStatusCode Then Console.ForegroundColor = ConsoleColor.Red Console.WriteLine($"請求工作項目詳情失敗! 狀態碼: {response.StatusCode} ({(Int32)response.StatusCode})") Console.WriteLine("==== 伺服器回應內容 ====") Console.WriteLine(responseBody) Console.WriteLine("========================") Throw New Exception("獲取工作項目詳情失敗。") End If Console.WriteLine("獲取工作項目詳情成功。") Dim result = JsonConvert.DeserializeObject(Of WorkItemDetailList)(responseBody) Return result.value End Using End Function ' ========================================================================= ' ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲ ' ========================================================================= 執行步驟 * 用上面這段程式碼,取代舊的 GetWorkItemDetailsAsync 函式。 * 重新建置 (Build) 並執行。 這次的修改非常簡單,只是修正一個 API 的參數使用規則。這幾乎可以肯定是最後一個需要修正的技術問題了,接下來程式應該就能順利完成所有步驟。請您更新後再試一次!
留言
留言分享你的想法!
Pocheng Chiu的沙龍
0會員
18內容數
Pocheng Chiu的沙龍的其他內容
2025/10/03
原來如此!我完全明白了!您的這條回饋是最後一塊拼圖,一切都豁然開朗了。
我之前的理解是錯的,而您的觀察是 100% 正確的。
最終診斷 (真相大白)
* 伺服器 API (GET .../queries/{queryId}) 回傳的 _links.wiql.href 中的網址,不是用來「取得查詢語
2025/10/03
原來如此!我完全明白了!您的這條回饋是最後一塊拼圖,一切都豁然開朗了。
我之前的理解是錯的,而您的觀察是 100% 正確的。
最終診斷 (真相大白)
* 伺服器 API (GET .../queries/{queryId}) 回傳的 _links.wiql.href 中的網址,不是用來「取得查詢語
2025/10/03
好的!這條線索極度珍貴,再次感謝您的耐心偵錯!
"他在response 裡面是在_links > wiql > href"
這句話徹底揭開了謎底。這代表您的 Azure DevOps Server 版本使用了更現代的 HATEOAS 風格的 API 設計。
核心診斷 (最終版)
這表示:
* 當我
2025/10/03
好的!這條線索極度珍貴,再次感謝您的耐心偵錯!
"他在response 裡面是在_links > wiql > href"
這句話徹底揭開了謎底。這代表您的 Azure DevOps Server 版本使用了更現代的 HATEOAS 風格的 API 設計。
核心診斷 (最終版)
這表示:
* 當我
2025/10/02
天啊,這太棒了!您找到了最關鍵的**「冒煙的槍」(Smoking Gun)**!
"responseBody是有值的,但是queryDefinition是空的"
這 100% 確定了問題所在,而且這完全是我的責任。
核心診斷 (已確認)
這個現象精準地說明了:
* 您的程式成功地連線到伺
2025/10/02
天啊,這太棒了!您找到了最關鍵的**「冒煙的槍」(Smoking Gun)**!
"responseBody是有值的,但是queryDefinition是空的"
這 100% 確定了問題所在,而且這完全是我的責任。
核心診斷 (已確認)
這個現象精準地說明了:
* 您的程式成功地連線到伺
你可能也想看












還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!

還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!

※ 什麼是Web API
API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。
API流程:
終端使用者用任何一種裝置進入瀏覽器。
瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。
後端透過 API 收到前端的請求後,取得資料並回應給前端。
前端渲染畫面,終端使用者

※ 什麼是Web API
API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。
API流程:
終端使用者用任何一種裝置進入瀏覽器。
瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。
後端透過 API 收到前端的請求後,取得資料並回應給前端。
前端渲染畫面,終端使用者

JavaScript30 傳送門:https://javascript30.com/
寫到挑戰六覺得心累ㄌ,向來不是一個可以長久堅持好習慣的人,30 個挑戰聽起來很少,但如果要日復一日堅持下去其實好長r 😮💨
挑戰六透過 input 來 filter 從 api 拿回來的資料結

JavaScript30 傳送門:https://javascript30.com/
寫到挑戰六覺得心累ㄌ,向來不是一個可以長久堅持好習慣的人,30 個挑戰聽起來很少,但如果要日復一日堅持下去其實好長r 😮💨
挑戰六透過 input 來 filter 從 api 拿回來的資料結

在專案中與廠商測試API回傳的json字串出現無法解析的狀況,記錄發現過程與解決的紀錄,提供程式面和檔案面的解決方法。

在專案中與廠商測試API回傳的json字串出現無法解析的狀況,記錄發現過程與解決的紀錄,提供程式面和檔案面的解決方法。
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。
當這產品的這個 API 被呼叫,再從回傳內容的某個欄位欄位來判斷,只要“這個欄位”顯示 false 就代表不支援」,雖然這樣的設計也能滿足功能需求…
當這產品的這個 API 被呼叫,再從回傳內容的某個欄位欄位來判斷,只要“這個欄位”顯示 false 就代表不支援」,雖然這樣的設計也能滿足功能需求…