记一次http接口调试问题

在开发工程中,在开发工程中,我们经常会遇到和其它第三方厂家有接口数据来往的情况。这是一次我们作为客户端去获取另一个厂家推流的直播地址的接口,这个接口情况有些不一样,我们需要在一个接口中封装两次http请求,大概场景是这样的:

第一次调用方式是POST,第二次是Get,第一次调用会获取到一个地址,返回结果类似这样的:

Java

这里获取到接口返回一个带参数的地址,这里注意一下,这个地址里有些特殊符号,如:下划线、等号之类的等等。我们还需要将返回的这个带参数的URL地址作为第二个请求的URL,并携带上第二个请求播放接口要求的请求参数使用get方式调用接口请求从而获取到一个重定向的地址,请求地址类似这样的:

Java

http返回码应该是302,这个地址才是真正的播放地址,其实是一个m3u8的播放流。对方通过这样的一个地址进行推流播放。很快这个接口封装好了,自己写了个单元测试进行调用测试;在做单元测试的过程中发现最终的返回码是200,而且响应的报文是空的,什么信息都没有。正常应该是返回302, 单独测试第一个接口的时候响应是正常的,测试第二个的时候出问题了,反复确认封装的请求参数是没有问题的,开始怀疑是对方响应有问题。后来我单独用第一个返回的地址带上参数在浏览器中请求是可以的,于是知道大概是URL被转码了的原因,因为第一个接口返回的地址是带了参数的,如上面参数里有很多特殊字符。我在请求的时候自己封装了一个httpclient工具类,里面有封装的带参数的get方法是这样写的:

Java

这里在构造请求时使用的是 java.net.URI 来构造的,而经过查询,从jdk的一个bug回复中知道:JDK-8132508 : Bug JDK-8029354 reproduces with underscore in hostname

Java

说明了java.net.URI 的域名只能由 字母 (A-Z), 数字(0-9), 减号 (-), 和 点 (.) 组成。也就是说 java.net.URI 验证了 hostname。同时也看到了在 java.net.URL 中不会做这个验证。所以问题找到了,所以我们把这个方法换成其它方式来构造就正常返回了。

Java

赞同提交bug的网友的意见,这样会隐藏很多的坑。为什么一个验证了域名一个却不做验证。我们也看到bug提交之后得到回复这不是一个bug。

以上所述是小编给大家介绍的Spring Boot 模块组成,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的!

Java学习资料获取(复制下段连接至浏览器即可)
data:text/html;charset=UTF-8;base64,5p625p6E5biI5a2m5Lmg6LWE5paZ5YWN6LS56aKG5Y+W6K+35Yqg5omj5omj5Y+35pivMTAxODkyNTc4MA==

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值