当前位置: 首页 > 知识库问答 >
问题:

java - curl 请求后端图片接口时 后端报错(curl未选择接受图片),如何解决?

狄飞鹏
2023-11-20

问题来源

一个图床 其中处理图片的逻辑是本地读取图片并且以流的形式写入 response
在本地使用curl请求的时候(未配置curl参数) 的情况下请求的时候图片会报错
java.io.IOException: 你的主机中的软件中止了一个已建立的连接

尝试解决

在请求中判断header 如果是curl开头的就返回不支持json
但是这样会导致curl无法获取图片而且如果有其他类似curl的不接受文件流的也会报错

问题

想问如果实现对这类请求的过滤 让其返回一个不支持的json

其他信息

curl请求命令: curl http://127.0.0.1:8080/3862f6ea2fe849d8b922dc135556a4c4
controller层 response设置:

//photoEntity是图片文件response.reset();response.setCharacterEncoding(StandardCharsets.UTF_8.toString());response.setContentLengthLong(photoEntity.getSize());response.setContentType(photoEntity.getType());response.setHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(uuid, StandardCharsets.UTF_8));

共有1个答案

孙书
2023-11-20

你描述得太混乱了,你的意思是通过curl请求接口时后端报错,所以你认为这是curl导致的,并且想要过滤并特殊处理这种请求吗?
这里面有几个问题:0.为什么报错?1.凡是curl就会导致这个报错吗?2.这个报错需要特殊处理吗?3.怎么特殊处理这种异常?
一个一个回答。
0.因为你提供的信息比较少,所以根据一般经验,我觉得这是因为你在通过curl调接口的时候没有指定响应文件怎么处理,所以curl可能直接读取了响应头之后就关闭了连接。这时候server还在尝试向curl客户端发送数据,但是对方已经关闭了,所以才会报错。
1.使用curl可以通过-o或--output指定文件保存路径。理论上curl是可以模拟任何http请求的,所以我不觉得这是curl的问题,如果curl有问题,那可能意味着别的客户端也调不了你的接口。
2.通过curl发起的请求和一般的http请求没任何区别,所以我觉得不需要区分出来。你也看到了异常类型是IOException IO异常,假设你用认为正常能用的client调接口,传输图片的过程中client的网断了,server也一样会报这个异常。这种异常本来就不是server端导致的,所以按理说也不该由server去处理。
3.不想在控制台打印堆栈信息,可以声明一个接口切面做异常处理,如果判断异常类型是IOException就不打印。

 类似资料: