6

一次go http调用java后端post请求报错的排查

 3 years ago
source link: https://studygolang.com/articles/32334
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

问题描述

近段时间,在开发数据网关,开发语言用的是golang。昨天需要调用一个java的后端接口,本地postman请求正常,但是用公司封装的go httpclient就不行。公司的go httpclient集成了一些metric、重试、http连接管理等功能。

postman的请求示例如下(可以通过postman的code功能生成curl或者其他的代码示例):

curl --location --request POST '接口地址' \
--header 'Content-Type: application/json' \
--data-raw 'json字符串'

排查过程

  1. 首先想到的是对方后端是不是没加@RequestBody注解,然后看了下对方的controller代码,发现没有问题。
  2. 然后想到的是自己的请求体是否有问题,于是查看了go client调用的日志,获取到请求的uri,请求参数,使用postman请求发现没问题
  3. 因为看代码实在没看出问题,于是开始了抓包
    a. 首先使用的是charles,因为这个对于抓http的包比较方便,代理之后还可以拦截请求。但是会发现postman的请求可以拦截,但是go client的请求拦截不了
    b. 使用wireshark开始抓包
  4. 首先使用postman请求接口,然后查看wireshark的请求体以及请求头信息。这个过程也加深了自己对http的理解。

    a. 首先在过滤栏输入http,截图如下

    VnYVvej.png!mobile

    截屏2020-12-25 下午1.37.40.png

    b. 获取请求头和请求体

    如上图,可以通过Source和destination或者info判断出哪个是请求,哪个是响应。然后展开请求那一行,大致会有如下信息

    iUVZBnn.png!mobile

    截屏2020-12-25 下午1.41.49.png

    uuqeYvb.png!mobile

    截屏2020-12-25 下午1.48.05.png

    c. 分别将postman和go client的请求粘在一个文档中,一一比对,发现go client多了几个请求头(主要是用于trace的)
    d. 使用控制变量的方法,将多出的请求头粘贴到postman的header中,发现加了这几个header报了go client一样的错,去除这几个header正常

问题原因及收获

问题的原因主要是go client多了几个请求头,导致别的后端那边解析报错。

收获主要就是发现问题后,尝试了几乎各种解决方法,学习了使用wireshark进行抓http的包,并进行分析。

最后解决

查看client的源码,然后重新写了一个client,去除了包装header的逻辑(这个请求头java端不用),调用返回成功。

有疑问加站长微信联系(非本文作者)

eUjI7rn.png!mobile

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK