使用Alamofire调用Web API遇301/302重定向问题求助
解决Alamofire请求HTTP时遇到302重定向无法获取JSON的问题
首先得把问题点透:浏览器会自动处理302重定向并加载目标地址的内容,但Alamofire默认不会自动跟随跨协议(HTTP→HTTPS)的重定向,更关键的是你的服务器返回的重定向提示是HTML格式,而你的应用期望JSON数据,自然会解析失败。既然没法修改应用代码,咱们完全可以从服务器端下手解决。
推荐方案:用Apache代理转发API请求(无需修改应用)
这个方案的核心是让服务器把HTTP的API请求直接代理到HTTPS的API接口,把HTTPS返回的JSON数据原封不动回传给应用,应用完全感知不到重定向的存在,完美适配你不能改应用的需求。
步骤1:确认Apache模块开启
先确保你的Apache服务器已经启用了mod_proxy和mod_proxy_http模块——大部分主机商默认开启,如果没开的话,需要通过服务器控制面板或修改Apache配置文件启用这两个模块。
步骤2:修改.htaccess配置
替换你现有的重定向规则为以下代码:
RewriteEngine On # 针对API路径的HTTP请求,直接代理到HTTPS接口 RewriteCond %{HTTPS} off RewriteCond %{REQUEST_URI} ^/webservices/ [NC] RewriteRule ^(webservices/.*)$ https://%{SERVER_NAME}/$1 [P,L] # 非API的HTTP请求,依然保持原逻辑重定向到HTTPS RewriteCond %{HTTPS} off RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
[P]标志告诉Apache把请求作为代理转发到目标地址[NC]表示忽略路径的大小写匹配- 配置生效后,应用发送的HTTP API请求会被服务器悄悄转发到HTTPS接口,返回的就是正常的JSON数据,应用完全不需要做任何修改。
备选方案:返回JSON格式的重定向响应(需应用兼容)
如果代理方案不可行(比如主机商禁用了mod_proxy),可以修改重定向规则,让服务器针对API请求返回JSON格式的重定向提示,而不是HTML页面。不过这个方案需要应用能读取响应头或响应体来处理跳转,如果你没法改应用,这个方案只能作为备选:
RewriteEngine On # 标记API请求的重定向状态 RewriteCond %{HTTPS} off RewriteCond %{REQUEST_URI} ^/webservices/ [NC] RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=302,L,E=API_REDIRECT:true] # 针对标记的API重定向,返回JSON格式响应 Header always set Content-Type application/json env=API_REDIRECT Header always set X-Redirect-To "https://%{SERVER_NAME}%{REQUEST_URI}" env=API_REDIRECT RewriteRule ^ - [E=!API_REDIRECT] # 其他请求的重定向规则 RewriteCond %{HTTPS} off RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
这个配置会让API重定向时返回JSON格式的响应头,同时带上X-Redirect-To头,但还是那句话,如果你没法修改应用逻辑,这个方案的实用性不高。
内容的提问来源于stack exchange,提问作者Amit Singh
相关产品推荐
相关产品推荐

