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




















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

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

本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。

本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
當這產品的這個 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字串出現無法解析的狀況,記錄發現過程與解決的紀錄,提供程式面和檔案面的解決方法。
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。

長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。

長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例

若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。

若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。







