Su的技术博客

  • 首页
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • Other
  • 工具
  • 打赏
  • 关于
  1. 首页
  2. 事故复盘
  3. 正文
                           

【原创】iOS请求访问文件网关服务图片接口异常问题的解决

2021-07-16 42点热度 0人点赞 0条评论

1
问题背景

文件网关服务提供访问图片的接口,Android和浏览器访问正常,然而就唯独iOS这边死活访问失败,失败信息如下:

Error Domain=NSURLErrorDomain Code=-999 "已取消" UserInfo={NSErrorFailingURLStringKey=https://service.xxx/link/1202010141537537440000, NSErrorFailingURLKey=https://service.xxx/file-gateway/link/1202010141537537440000, _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask <59E2FB02-C920-4BD5-8F61-7B2150D154ED>.<1>" ), _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <59E2FB02-C920-4BD5-8F61-7B2150D154ED>.<1>, NSLocalizedDescription=已取消}

2
定位解决

1)从上面的信息,大概只能看到请求被取消,但是到底是什么原因还是不能确定。

在网上找了大量信息,有的说域名证书问题(运维排除),有的说iOS端处理的问题(iOS排除),等等始终找不到对应我们的问题并能解决。


2)接着以为是iOS对http响应头信息比较严格,跟正常访问图片的地址进行对比,尝试加了响应头字段信息比如:Last-Modified等始终还是一样的问题,没能解决(之前增加之后iOS同事说没问题了,但是现在却不行了??疑惑。)。


3)这个时候就想从http请求入手,跟进下网络请求的具体操作。就让iOS开发同事能不能在客户端那边做debug,或者将请求信息,比如请求头,响应头信息打印出来提供给我这边看下是哪里的问题?


下面是iOS同事提供的请求头信息:

◆异常请求响应头:

◆正常请求响应头:

显然,我们从异常请求的状态码是406,即为“Not Acceptable”,也就是请求信息不被接受/允许。


接下来就让iOS同事把请求头信息提供下,如下:

于是将其Accept值放到本地postman进行重现,可以重现那么就可以自行在本地环境进行找原因。

可以发现,iOS是要求接受的类型是image/webp和image/*,所以相对就比较严谨,我发现为什么我们浏览器都能正常返回和响应,原因是:

前面的image/X都没有匹配到我们实际的图片资源image/png,所以最终就走了默认*/*,基本上就能正常通过。

回复公众号【资料】获得干货资料集锦:技术ppt、IT大会资料、架构、分布式资料等。

4)接着查看文件网关提供的接口源码

发现Controller上面被@Produces注解, 并且使用MediaType.APPLICATION_JSON,即application/json。所以基本上就知道异常问题的罪魁祸首了吧。


5)解决

去掉Controller上面的@Produces注解,或者在具体的方法上增加注解@Produces("image/*")。

3
总结

1)确定http接口请求接受的类型,即请求头Accept,不能盲目的设置。


2)controller上面尽量少使用@Produces,这种全局配置会将提供的具体接口都统一为一样,而是在具体接口上增加@Produces区分。


3)出现网络请求问题,可以先尝试打印请求头和响应头、响应体信息,看下是否有具体的异常,也不要停留在使用一些依赖组件抛出的问题,比如此次的iOS “code=-999 已取消”(明显,这种异常信息可能没什么用!),最后也许可能需要用到抓包技术来获取具体的报文信息等。

2020记

推荐好文
1、互联网Code Review最佳实践分享
2、dubbo面试题!会这些,说明你看懂了dubbo源码
3、Kafka面试题!掌握它才说明你真正懂Kafka
4、
Netty 5.0为啥被舍弃?原因竟然是...
5、
中台之上——业务架构系列【汇总】
6、必备瑞士军刀IDEA插件,你使用了哪些
7、线上热更新代码只需3步 Arthas实战
8、Eureka源码剖析之七:架构&面试题【总结】
9、互联网工程师应该用这种姿势打印日志

标签: 原创 事故复盘 iOS 文件网关 HTTP 网络
最后更新:2023-02-19

Cocodroid

专注Java后端,分享技术。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

最新 热点 推荐
最新 热点 推荐
殷浩详解DDD 第四讲:领域层设计规范 既生@Resource,何生@Autowired? Go整洁架构实践 接口优化的常见方案实战总结 QQ音乐高可用架构体系 构建一个布隆过滤器 —— Building a Bloom filter
殷浩详解DDD 第四讲:领域层设计规范Redis为什么这么快?构建一个布隆过滤器 —— Building a Bloom filterQQ音乐高可用架构体系接口优化的常见方案实战总结Go整洁架构实践
笔记 | 5种网络IO模型 殷浩详解DDD系列 第一讲 - Domain Primitive Kafka如何选择合适的分区数,你选对了吗 猪八戒网DevOps之Java组件安全检测 ElasticSearch之各大版本演进,发布8.0.0 Alpha 2版本 阿里云香港云服务器P0史诗级宕机事件复盘

@Autowired (1) @Resource (1) API网关 (1) ddd (6) DP (1) ElasticSearch (1) eureka (7) go (1) HTTP (1) IDEA (1) iOS (1) Java (8) JSR (1) QQ音乐 (1) repository (1) Spring (1) SQL优化 (1) 代理 (1) 依赖注入 (1) 同城双活 (1) 垃圾回收 (1) 定时任务 (1) 容灾 (1) 布隆过滤器 (1) 异地双活 (1) 接口优化 (1) 故障转移 (1) 数据库 (2) 整洁架构 (1) 文件网关 (1) 方案 (2) 服务续约 (1) 注册中心 (7) 流水账 (1) 流量 (1) 第五 (1) 线上案例 (1) 线上问题 (2) 缓存 (1) 缓存击穿 (1) 编译 (3) 网络 (3) 聊聊 (1) 订单 (1) 设计规范 (1) 详解 (1) 连接池 (1) 限流 (1) 领域驱动设计 (4) 高可用 (1)

COPYRIGHT © 2014-2023 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2