写在前面:首先,网上90%的解决方法是在使用getInputStream()之前先getResponseCode()获取状态码进行判断:如果出错,就用getErrorStream();不出错就用getInputStream()。不得不说这种方法脑洞真奇怪。我们要做的是从根源解决问题,而不是主动对问题视而不见。既然你getInputStream()出错了,返回的状态码不对,你就应该去从根本解决问题啊,是400就找400引发的根源,是404就去看链接是不是写的不对,是500就去程序里debug哪里出错了;换了个getErrorStream()去获取数据,要么获取到的是空的,要么就是对应的状态码数据,比如400,那就是bad request,404,那就是not found。获取这个有啥用呢?只有极少数的解决方法是从getInputStream()的源码去分析问题,另外的极少数是从状态码的根源去着手。
我的问题如下图:
部分代码如下:
if (params.getEndpoint().startsWith("http")) {
if (params.getEndpoint().startsWith("https")) {
url = new URL("https", host, 80,
"/" + params.getBucket() + "/" + key + imageParams);
} else {
url = new URL("http", host, 80,
"/" + params.getBucket() + "/" + key + imageParams);
conn = (HttpURLConnection) url.openConnection();
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setRequestMethod("GET");
conn.connect();
int code = conn.getResponseCode();
inputStream = conn.getInputStream();
同一个方法,不同的key,得到了不同的状态码。开始还以为是不同的接口里的具体处理方式不同,可能是因为URL长度导致的400错误。后来重新用了几个参数才发现不是这样,并且两个URL链接放在浏览器里面是可以访问的(图中debug时URL的值)。这个问题困扰了我好久,直到我把链接从浏览器复制下来,大概长这样
.........(前面的省略)picUri=devpictures/2020110911/E%E5%AE%9E%E6%96%BD2.0%E6%B5%8B%E8%AF%95%E8%BD%A6%E5%9C%BA/20201109112729.995_plateinfo_17511111181123.%E6%97%A0%E7%89%8C.full.jpg&compressFlag=1
可以很清楚得看到,链接里面的中文汉字都被转换成形如了E%E5%AE%9E%E6%96%这种形式。恍然大悟的我才明白是那个相对较长的链接里有中文字符未处理,果断把代码从之前的改成了下面的形式
url = new URL("https", host, 80, "/" + params.getBucket() + "/" + key + imageParams);
url = new URL("https", host, 80,"/" + params.getBucket() + "/" + URLEncoder.encode(key, "utf-8") + imageParams);
问题完美解决!
注:URLEncoder的encode()方法会将链接的所有特殊字符转换成特定的编码(比如utf-8)。用的时候注意不要把不必要转换的字符一并转了,比如http://里的://也属于特殊字符。
java httpUrlConnection 调用远程接口报4001.问题的出现:线下开发时候使用httpUrlConnction测试调用远程接口一点问题都没有,但是打包后放到线上去后出现400的错误同样的参数在线下可以调试,放在线上就不行了。分析一般报400说明接口接收到了错误的参数,由于是远程调用别人的服务器接口看不到那边的日志,我们这边只有一个400 ,信息提示说对面json解析错误。那么我...
问题背景:
很多人在客户端做http请求的时候,往往会执行完getOutputStream之后就立即执行getInputStream去获取服务端返回的数据,这种方式大多数情况下也能正确的完成http交互,但是当网络出现故障或者服务端自定义了大于400的响应码时,就会出现getInputStream抛出FileNotFoundException的异常,文件找不到?
理论依据:
用Java访问第三方接口时报400,打断点查看时在getInputStream()方法执行时抛出了异常
解决:判断响应码getResponseCode()不是200,201,202的话,使用getErrorStream()而不是直接getInputStream()
* 获取url网址返回的数据内容
* @param urlStr
* @return
public s...
在项目中遇到了一个HttpURLConnection网络请求报异常的问题 java.io.FileNotFoundException,后来通过debug定位到具体得问题出现在 urlConnection.getInputStream()上。HttpURLConnection POST请求时,当getResponseCode为HttpURLConnection.HTTP_OK(200)和HttpURLConnection.HTTP_CREATED(201)时正常连接,其他值时比如(403),httpURL
其实问题很简单,就是很正常的HttpURLConnection POST连接,当getResponseCode为HttpURLConnection.HTTP_OK(200)和HttpURLConnection.HTTP_CREATED(201)时没有任何问题。
记录一次使用HttpURLConnection或HttpsURLConnection获取文件400报错问题,及解决办法。话不多说直接上代码。请求路径,http:// 192.168.57.** :8080/upload/file/小学生报名表_20220829215306A002.xlsx报错如下:400。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
public class ToInter...
java httpUrlConnection 调用远程接口报400
1.问题的出现:
线下开发时候使用httpUrlConnction测试调用远程接口一点问题都没有,但是打包后放到线上去后出现400的错误同样的参数在线下可以调试,放在线上就不行了。
一般报400说明接口接收到了错误的参数,由于是远程调用别人的服务器接口看不到那边的日志,我们这边只有一个400 ,信息提示说对面jso...
我正在使用HttpURLConnection上传图像文件,该图像文件包含所有标头的5MB文件大约需要3秒,但是当我使用.getInputStream()打开InputStream时,该方法大约需要8秒才能返回流.这是一个问题,因为如果我要上传多个图像,则上传进度栏似乎提供了错误的UX,每次上传之间它们都有相当大的暂停时间,因此进度栏在两次上传之间仅停留了几秒钟.我已经进行了一些谷歌搜索,但是似乎没...
参见英文答案 >get body of Bad Request httpURLConnection.getInputStream()3个我使用以下代码向我的Web服务发送JSON请求,并且对于错误请求,我返回400消息代码以及有效负载中的详细JSON错误响应.我不明白在使用HttpURLConnection时如何在客户端...
后台使用http请求获取其他服务的数据,使用GET请求在url后面拼接参数发送请求。在本地编写对端的测试接口进行测试。每次代码走到HttpURLConnection对象的getInputStream()方法时都会阻塞,在测试接口内打的断点也没有走到,然后尝试通过浏览器直接输入url请求接口成功进入断点。。。
后来反复测试无意中将接收请求的接口内断点都去掉,http请求竟然执行成功。。。有没有大神...
通过url链接获取文件流报400错误
在实际开发过程中,我遇到一个同一份代码,在本地测试和线上测试出现不同结果问题。其问题定位找到是因为通过HttpUrlConnection获取url文件流报错400。
通过在网上查找该方法报错400的解决办法,根据网上所说有的是因为url里包含空格,需要转换成%20
if(urlPath.contains(" ")){
urlPath = urlPath.replace(" ","%20");
但是,我通过这种方式设置还是一样未解决问题。还有很多人说设置UR