太棒了!我們終於成功突破最困難的部分了! 「成功找出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會員
24內容數
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% 確定了問題所在,而且這完全是我的責任。
核心診斷 (已確認)
這個現象精準地說明了:
* 您的程式成功地連線到伺
你可能也想看



















當這產品的這個 API 被呼叫,再從回傳內容的某個欄位欄位來判斷,只要“這個欄位”顯示 false 就代表不支援」,雖然這樣的設計也能滿足功能需求…
當這產品的這個 API 被呼叫,再從回傳內容的某個欄位欄位來判斷,只要“這個欄位”顯示 false 就代表不支援」,雖然這樣的設計也能滿足功能需求…

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

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

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

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

5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。

5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。

背景:從冷門配角到市場主線,算力與電力被重新定價
小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題

背景:從冷門配角到市場主線,算力與電力被重新定價
小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題

這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。

這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。

本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。

本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。

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

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









