jjzjj

go - 在发送嵌套的 http 请求时不断获取 EOF

coder 2024-07-09 原文

我有一个客户端和两个服务器(都是 Go 中的服务器)。所有解决方案都与从一台服务器向另一台服务器发送多个请求有关。但是我正在尝试实现这种类型的通信:

Client         Server A        Server B
Request1  -->  Received
               Request 2  -->  Received
               Received   <--  Request 3
               Response 3 -->  Received
               Received   <--  Response 2
Received  <--  Response 1

但是,我一直在对请求 2 的响应中收到 EOF 错误。我已经阅读了几篇关于该主题的文章,并尝试了所有可能的解决方案,但没有解决这个问题。这是我为发送 POST 请求而编写的代码。服务器 A 和服务器 B 正在调用相同的代码。

func SendPost(url string, insecureSkipVerify bool, authHeader *CAuthHeader, contentType string, otherHeaders map[string]string, body string, v interface{}) (string, error) {
    bBody := strings.NewReader(body)
    req, err := http.NewRequest("POST", url, bBody)
    if err != nil {
        return "", utilities.GetError("01: ", err.Error())
    }
    req.Close = true

    if authHeader != nil {
        req.Header.Set(authHeader.GetHeaderStrings())
    }
    req.Header.Set(HEADERKEY_CONTENTTYPE, contentType)

    for k, v := range otherHeaders {
        req.Header.Set(k, v)
    }

    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: insecureSkipVerify},
    }

    utilities.DebugLog("-------> SENDING POST: %s", url)
    netClient := &http.Client{Timeout: 40 * time.Second, Transport: tr}

    resp, err := netClient.Do(req)
    if err != nil {
        // GETTING ERROR LOG HERE IN REQUEST 2
        utilities.DebugLog("<------- RECEIVED POST: %s, with error: %s", url, err.Error())
        return "", utilities.GetError("02: ", err.Error())
    }
    defer resp.Body.Close()

    utilities.DebugLog("<------- RECEIVED POST: %s", url)
    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return "", utilities.GetError("03: ", err.Error())
    }

    utilities.DebugLog("%s", string(b))

    // MAY IGNORE THIS, JUST POPULATES THE RESPONSE INTO THE interface() PASSED AS A PARAMETER TO THIS FUNCTION
    if err := populateInterface(b, v); err != nil {
        return string(b), err
    }

    utilities.DebugLog("Received body: %s", string(b))

    return string(b), nil
}

我在服务器A上得到的日志是:

2019-02-21 18:33:57.579758 +0530 IST m=+80.025904414: -------> SENDING POST: http://localhost:7350/v2/rpc/refreshPublicProfile?http_key=defaultkey
2019-02-21 18:34:13.517802 +0530 IST m=+95.963470623: <------- RECEIVED POST: http://localhost:7350/v2/rpc/refreshPublicProfile?http_key=defaultkey, with error: Post http://localhost:7350/v2/rpc/refreshPublicProfile?http_key=defaultkey: EOF

服务器B上的日志是:

2019-02-21 18:33:57.586869 +0530 IST m=+74.893470343: -------> SENDING POST: http://localhost:8103/publicprofile
2019-02-21 18:34:13.513541 +0530 IST m=+90.819664927: <------- RECEIVED POST: http://localhost:8103/publicprofile

正确的做法是什么?

最佳答案

问题不在于 golang http 包,而在于服务器 B,这是一个第三方服务器,如果请求运行超过 10 秒,它不会发送响应。因此,服务器 A 收到了上面列出的错误。然而,值得注意的学习,都归功于@JimB:

  1. 最小的、完整的和可验证的示例被证明是非常有用的,因为我最终创建了一个并且没有在那里观察到相同的错误。这让我相信问题与服务器 B 有关,它是第三方应用程序。我已经向他们的团队提交了一个错误,他们现在正在调查。

  2. 现在已经使用默认值构建了传输:

    tr := http.DefaultTransport.(*http.Transport)
    if tr.TLSClientConfig == nil {
        tr.TLSClientConfig = &tls.Config{InsecureSkipVerify: insecureSkipVerify}
    } else {
        tr.TLSClientConfig.InsecureSkipVerify = insecureSkipVerify      
    }

事实证明,这是我浪费了几天时间的误报。不确定这是否对任何人有帮助,但仍然想发布最终解决此问题的详细信息。

关于go - 在发送嵌套的 http 请求时不断获取 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54808204/

有关go - 在发送嵌套的 http 请求时不断获取 EOF的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  3. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  4. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  5. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  6. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  7. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

  8. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  9. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  10. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

随机推荐