You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Alamofire带自定义Headers发起GET请求遇401错误排查求助

排查Alamofire请求401但Postman正常的常见遗漏点

你遇到的这个情况其实很常见——明明看起来请求参数一致,但App里就是返回401,Postman却正常。既然你已经确认Headers存在,那可以从以下几个容易忽略的点入手排查:

1. Authorization头的拼写/完整性问题

从你的代码片段看,Authorization头只写了"Autho...",这大概率是没写完?如果实际代码里真的是拼写错误(比如少了rization),那服务器根本识别不了这个授权头,自然返回401。哪怕你打印Headers时看到这个键存在,拼写错误的话服务器也不会处理它。

2. 授权头值的格式错误

很多服务器要求Authorization头是Bearer <token>的格式(注意Bearer和token之间的空格)。如果你在App里把它写成了Bearer<token>(没空格),或者token前后多了空格/换行,服务器会认为授权无效。Postman在添加Bearer token时会自动处理这个空格,但手动写代码很容易漏。

3. URL拼接的编码问题

你手动拼接了url_id = URL_USER_ID + String(self.userID),如果userID包含特殊字符(比如中文、空格、&、=等),直接拼接会导致URL格式错误。Postman会自动对URL进行编码,但App里手动拼接的话不会,这会让服务器收到错误的请求路径,进而返回401(比如服务器找不到对应的用户资源,或者认为你没有访问该错误路径的权限)。

解决方法是用系统的URL编码方法处理:

if let encodedUserID = String(self.userID).addingPercentEncoding(withAllowedCharacters: .urlPathAllowed),
   let url_id = URL(string: URL_USER_ID + encodedUserID) {
    // 用这个url_id发起请求
}

4. 请求方法不匹配

Alamofire默认使用GET方法发起请求,但如果Postman里你用的是POST/PUT等其他方法,那App里的请求方法就错了。很多服务器会对不同请求方法的权限做限制,方法不对直接返回401。

检查Postman的请求方法,然后在Alamofire里明确指定:

AF.request(url_id, method: .post, headers: header) // 改成Postman对应的方法

Postman会自动保存登录后的Cookie,但App里的Alamofire Session默认可能没有保留Cookie。有些服务器会同时验证Authorization头和Cookie(比如防止CSRF),如果App里没有携带对应的Cookie,就会返回401。

你可以检查Alamofire的Session配置是否允许存储Cookie:

let configuration = URLSessionConfiguration.default
configuration.httpCookieAcceptPolicy = .always
let session = AF.Session(configuration: configuration)

或者如果知道Cookie的键值对,直接手动添加到Headers里。

6. 抓包对比请求细节

最直接的方法是用Charles或Proxyman抓包,把App发出的请求和Postman的请求做逐字段对比:

  • 检查所有Headers的键名、值是否完全一致(包括大小写、空格、特殊字符)
  • 对比请求URL的编码是否一致
  • 检查请求体的格式、内容是否完全相同(比如JSON的空格、逗号,是否有多余/缺失的字段)
  • 确认请求方法、协议(HTTP/HTTPS)是否一致

很多时候问题就藏在这些细节里,比如Postman自动加了某个你没注意到的Header,或者App里的请求体有个多余的逗号。


内容的提问来源于stack exchange,提问作者AND4011002849

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:56:05