Trello REST API创建卡片返回401 仅代码调用触发未授权错误
问题根因
你的代码核心错误是把curl命令的专属参数语法直接拼进了HTTP请求URL,HttpClient不会识别curl的-d、--header这类命令行参数,这些内容被当成URL查询串的一部分,直接污染了key、token鉴权参数,Trello服务端解析不到合法的鉴权信息,自然返回401未授权。
具体错误点:
- 你拼接的URL末尾附带了整段curl参数
-d '{{\"name\":\"...\"}}' --header \"Content-Type: application/json\",这部分不属于合法URL内容,直接破坏了鉴权参数的有效性 - 代码中创建的
HttpRequestMessage完全没有被使用,调用PostAsync时传入的data是空字符串,既没有正确设置请求头,也没有把卡片数据放到请求体中 StringContent默认的Content-Type是text/plain,不符合Trello API要求的application/json格式,即使鉴权通过也可能触发请求格式错误
修复方案
- 修正URL拼接逻辑:URL中只保留接口地址、资源定位参数和鉴权参数,完全移除curl命令相关的内容
正确的URL拼接代码:// 注意确认_trelloAPI的值为"https://api.trello.com/1/",末尾带斜杠避免路径拼接错误 string url = $"{_trelloAPI}cards?idList={listId}&key={_trelloAppKey}&token={_trelloAppToken}"; - 单独构造JSON请求体:不要把JSON数据拼到URL里,POST请求的业务数据要放在请求体中,禁止手动拼接JSON字符串避免特殊字符导致格式错误,用序列化工具生成JSON:
// 构造要提交的卡片数据对象 var postData = new { name = card.Name, desc = card.Desc }; // 用Unity内置JsonUtility或项目中使用的JSON工具序列化为字符串 string jsonBody = JsonUtility.ToJson(postData); - 修正请求函数,正确设置请求头和请求体:
private static async Task<bool> SendTrelloPostHttpRequest(string url, string jsonBody) { Debug.Log($"Request URL: {url}"); using (var httpClient = new HttpClient()) { // 构造请求内容,指定编码和Content-Type为application/json var requestContent = new StringContent(jsonBody, System.Text.Encoding.UTF8, "application/json"); HttpResponseMessage response = await httpClient.PostAsync(url, requestContent); if (!response.IsSuccessStatusCode) { string errorMsg = await response.Content.ReadAsStringAsync(); Debug.LogError($"Request failed, code: {response.StatusCode}, detail: {errorMsg}"); return false; } string result = await response.Content.ReadAsStringAsync(); Debug.Log($"Request success, response: {result}"); return true; } }
校验提示
- 发起请求前打印最终生成的URL,和ReqBin中测试成功的URL逐字符对比,确认无多余空格、转义字符
- 如果仍有报错,打印接口返回的完整错误内容,Trello的错误信息会明确标注是鉴权失败、参数缺失还是格式错误
内容的提问来源于stack exchange,提问作者RasmusJari
相关产品推荐
相关产品推荐

