V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
guonaihong
V2EX  ›  编程

被 golang http 标准库蹂躏过的童鞋看过来

  •  
  •   guonaihong · 2019-08-22 09:30:40 +08:00 · 6439 次点击
    这是一个创建于 1680 天前的主题,其中的信息可能已经有所发展或是发生改变。

    苦逼的岁月

    还记得以前晚上接到紧急需求,说要快速搞定。打开 vim 带上标准库,调试 http client multipart/form-data 格式 ,时间一分分过去,眼睛看代码越来越模糊,踩过至少 3 个坑。ok,啪!终于大功告成,这时候没人注意到你的傻笑,同事们都下班了。按下屏幕,走出大楼,背起书包,骑着小单车,听着外面的蝉叫声,拖着疲惫的身体回去睡觉。
    

    再遇一次可以更快

    为了避免再遇到这种苦逼的事情。从开发效率出发,优化 http client 调用方式。这就是下面的项目。

    https://github.com/guonaihong/gout

    13 条回复    2019-08-22 21:39:23 +08:00
    misaka19000
        1
    misaka19000  
       2019-08-22 09:33:46 +08:00
    g.Get(url) 不是挺好的,为什么还要加个 .Do()
    guonaihong
        2
    guonaihong  
    OP
       2019-08-22 09:44:55 +08:00
    @misaka19000 为了设计成链式调用。
    hhyvs111
        3
    hhyvs111  
       2019-08-22 10:03:35 +08:00
    想问一下 go 原生的 http 有时候会返回 EOF 错误,这个是什么原因呢?
    alexkkaa
        4
    alexkkaa  
       2019-08-22 10:18:15 +08:00 via Android
    @hhyvs111 运营商阻断
    Akkuman
        5
    Akkuman  
       2019-08-22 11:04:45 +08:00
    感觉标准库都写出肌肉记忆了哈哈,用习惯了也还好,自己也踩过一些坑
    hopingtop
        6
    hopingtop  
       2019-08-22 11:42:01 +08:00   ❤️ 1
    再加入一些默认 http client 连接控制设置,重试等。 简单的 client 复用,会不会更美丽?
    https://github.com/huzhongqing/httplib
    guonaihong
        7
    guonaihong  
    OP
       2019-08-22 12:32:08 +08:00
    @hhyvs111 http 下面的 tcp 链接被关闭,会报这个错误。可以用代码模拟的。
    guonaihong
        8
    guonaihong  
    OP
       2019-08-22 12:32:35 +08:00
    @Akkuman 厉害厉害。
    guonaihong
        9
    guonaihong  
    OP
       2019-08-22 12:36:28 +08:00
    @hopingtop 可以可以,兄弟还有别的需求吗?我后面加上。
    hhyvs111
        10
    hhyvs111  
       2019-08-22 14:04:49 +08:00
    @guonaihong 什么情况下会被关闭呢?
    guonaihong
        11
    guonaihong  
    OP
       2019-08-22 14:13:37 +08:00
    @hhyvs111 对端异常终止(构造一个访问超级慢的 http client, 这时候把客户端 ctrl+c,这时候服务端就会收到 eof,反过来操作也行),或者 client 和 server 之间的通信节点有问题。
    hhyvs111
        12
    hhyvs111  
       2019-08-22 14:23:55 +08:00
    @guonaihong 我在想为什么 go 的 http 库没有及时得知这个连接被关闭了?
    guonaihong
        13
    guonaihong  
    OP
       2019-08-22 21:39:23 +08:00
    @hhyvs111 这和调用方式,如果要做成通知形式,事件触发只能放到网络层,语言只能设计成 callback 的形式。比如 nodejs 这种。go 是同步写法,只在用户在调用 read 之类的函数才和网络层交互,这时候才可以收到错误。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3506 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:51 · PVG 18:51 · LAX 03:51 · JFK 06:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.