Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. 事故复盘
  3. 正文
                           

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

2021-07-16 2701点热度 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、互联网工程师应该用这种姿势打印日志

更多文章:

  1. Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了!
  2. Commands与Events之间的区别
  3. 记一次网络请求连接超时的事故
  4. Spring事务无法生效的11个场景
  5. 26 条有效的AI提示词技巧
  6. 笔记 | 5种网络IO模型
  7. tomcat应用服务启不来,没有报错日志?不可能!
  8. MySQL8.0驱动升级事故——之三
  9. 手把手教你落地DDD
  10. 记一次堆内外内存问题的排查和优化
标签: 原创 事故复盘 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
取消回复

广告
最新 热点 推荐
最新 热点 推荐
干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务? 视频笔记:什么是AI 智能体? 视频笔记:什么是Flink? 如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具
Elasticsearch 使用误区之六——富文本内容写入前不清洗基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计干货 | 论Elasticsearch数据建模的重要性你可以不用RxJava,但必须得领悟它的思想!如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具视频笔记:什么是Flink?视频笔记:什么是AI 智能体?
架构师日记-从技术角度揭露电商大促备战的奥秘 Elasticsearch 使用误区之一——将 Elasticsearch 视为关系数据库! 敏捷宣言:敏捷开发的真正意义 干货 | 论Elasticsearch数据建模的重要性 OpenAI震撼技术圈!0代码构建Assistants API,技术原理探秘 10.领域驱动设计(译) 系统设计入门:成为高级软件工程师的指南 【视频】NettyInAction作者:统治一切的框架Netty- One Framework to rule them all

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (2) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (18) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

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

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2

x