V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
guonaihong
V2EX  ›  Go 编程语言

问卷调查:如果实现解析 curl 命令的库,大家感兴趣吗?

  •  
  •   guonaihong ·
    guonaihong · 2020-03-15 09:37:03 +08:00 · 5035 次点击
    这是一个创建于 1748 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问卷调查

    github 没有解析 curl 命令的库,再加上目前的知识储备实现这个库问题不大(熟悉 curl 命令选项 && go 的 http 客户端 && gnu 命令风格)。想知道如果对这个库感兴趣的童鞋多的话,4 月 1 号就开撸第一个版本。

    伪代码

    req, err := pcurl.ParseAndRequest(`curl -X POST -d '{"hello":"val")'`)
    resp, err := http.DefaultClient.Do(req)
    

    项目后面存放位置(现在还没开始)

    https://github.com/antlabs/pcurl

    48 条回复    2020-03-17 09:43:55 +08:00
    lasuar
        1
    lasuar  
       2020-03-15 10:16:11 +08:00
    搜罗一下,没找到做这个事的 pkg,做吧,有市场!
    hxse
        2
    hxse  
       2020-03-15 10:23:15 +08:00
    如果能支持多线程, 多任务下载, 像 aria2 那样, 很感兴趣
    tairan2006
        3
    tairan2006  
       2020-03-15 10:30:55 +08:00 via Android
    好像…没什么用啊,httpie 不是更友好么
    ClericPy
        4
    ClericPy  
       2020-03-15 10:51:01 +08:00
    用 py 搞过 chrome 导出的 curl 转 requests args dict, 算是比较有用的吧, 关键信息转 JSON, 标准化+持久化, 平时抓包拿个 curl 一句不改就在代码里存了请求 meta, 还是挺好用的, golang 这边没找到类似的
    ospider
        5
    ospider  
       2020-03-15 10:52:28 +08:00
    guonaihong
        6
    guonaihong  
    OP
       2020-03-15 10:56:42 +08:00
    @ospider 谢谢,刚刚看过了。https://mholt.github.io/curl-to-go/ 解析 curl multipart 格式有问题。
    可以用下面的命令 curl -F text=good -F voice=good.pcm www.qq.com 试下就知道。
    scukmh
        7
    scukmh  
       2020-03-15 11:02:11 +08:00
    为什么不做转换代码的工作呢,感觉这样写起来并没有什么用处呀。
    guonaihong
        8
    guonaihong  
    OP
       2020-03-15 11:06:15 +08:00
    @scukmh 是指看到 curl 命令之后,直接用代码撸类似请求?
    wolfie
        9
    wolfie  
       2020-03-15 11:10:49 +08:00
    chrome 的 curl 复制出来可以导入到 postman ( postman 导出无法导入回去)
    52coder
        10
    52coder  
       2020-03-15 11:16:02 +08:00
    比起这个我对如何使用 libcurl c/c++那个库实现多任务处理更感兴趣,哈哈哈,搜了好久没收到相关的例子,比如主线程往一个队列里插入任务,子线程比如最大并发 10 个任务同时处理,处理完一个再从任务里添加一个,我现在实现的比较挫,只能 10 个全部处理完再加 10 个,select 那啥的玩的不 6
    ETiV
        11
    ETiV  
       2020-03-15 11:17:10 +08:00 via iPhone
    #7 的想法可能有点用处,大概的场景:
    从 chrome network 里复制出 curl 的命令,贴进 terminal 里。把 curl 命令改为 curl2go,回车后转换出 golang 的使用其自带标准库的代码,使用时无第三方依赖

    而且感觉实现起来也简单些,直接用 flag 解析传进来的参数就好了
    augustheart
        12
    augustheart  
       2020-03-15 11:23:02 +08:00
    解析 curl 命令的库……我想了一下,这不是应该直接从 curl 的源码里面把代码抠出来就行么?
    再想了一下,哦,你们不是写 c/c++的……
    augustheart
        13
    augustheart  
       2020-03-15 11:23:33 +08:00
    再看了一下最上面,哦,原来是 go 栏目,我走错门了……
    guonaihong
        14
    guonaihong  
    OP
       2020-03-15 11:32:14 +08:00
    @ETiV 没懂 '把 curl 命令改为 curl2go' 这句是怎么实施的。
    23571113
        15
    23571113  
       2020-03-15 11:43:09 +08:00
    @guonaihong 用 go 做 libcurl 的 wrapper
    watzds
        16
    watzds  
       2020-03-15 11:46:04 +08:00 via Android
    一般都有动态参数,用这个怎么搞?
    直接生成对应语言的代码倒还行
    guonaihong
        17
    guonaihong  
    OP
       2020-03-15 11:47:05 +08:00
    @23571113 libcurl 包装会丢掉 go 强大的交叉编译能力,go 的代码很容易跑在 mac, linux, windows, freebsd 上。
    引入 gcc/g++就头疼了。
    guonaihong
        18
    guonaihong  
    OP
       2020-03-15 11:49:16 +08:00
    一般都有动态参数,如何理解?
    guonaihong
        19
    guonaihong  
    OP
       2020-03-15 11:49:48 +08:00
    @watzds 一般都有动态参数,如何理解?
    23571113
        20
    23571113  
       2020-03-15 11:58:28 +08:00
    @guonaihong 你可以先做 wrapper 再慢慢把底层替换, 先把功能实现, 要不容易弃坑.
    ETiV
        21
    ETiV  
       2020-03-15 12:06:09 +08:00 via iPhone
    把光标移到命令最开头……
    0o0O0o0O0o
        22
    0o0O0o0O0o  
       2020-03-15 12:16:41 +08:00 via iPhone
    我觉得如果有一个可以通过 curl 命令生成相同功能的 go 代码的 cli 会很有用。

    尝试过类似工具,但似乎制作者或是不太熟悉 go 的 http 的客户端,或是功能太简单无法覆盖 curl 那五花八门的选项。
    guonaihong
        23
    guonaihong  
    OP
       2020-03-15 12:17:19 +08:00
    @ETiV 其实想问怎么把 curl 命令转成 go 的代码?是指每遇到一种 curl 命令就手写完成同样请求的 go 代码?
    guonaihong
        24
    guonaihong  
    OP
       2020-03-15 12:20:19 +08:00
    @0o0O0o0O0o 这个问题也想过,如果想覆盖 curl 那五花八门的选项。使用生成代码的方式很难做完善。可组合情况太多。。。
    wentaoliang
        25
    wentaoliang  
       2020-03-15 12:49:16 +08:00
    curl 不同平台参数不一致,而且没有这个需求啊。
    hantsy
        26
    hantsy  
       2020-03-15 13:24:17 +08:00
    @tairan2006 httpie 一直不习惯,所以我还是用 Curl 比较多。Windows 下自带不行,有很多问题,所以现在也安装了 Cygwin。
    zthxxx
        27
    zthxxx  
       2020-03-15 16:04:29 +08:00
    guonaihong
        28
    guonaihong  
    OP
       2020-03-15 16:23:20 +08:00
    @zthxxx 谢谢啦,刚刚看了源代码,这个项目实现的 curl 选项也就 1,2 个,完整的 curl 选项应该是 175 个。这还不算-d 选项目后面还可以跟五花八门的配置项。
    最后 curlie 和 4 月 1 日要写的 pcurl 不矛盾,curlie 是命令行工具,pcurl 是库。简单地说 pcurl 可以实现 curlie,反过来不行。
    ggicci
        29
    ggicci  
       2020-03-15 16:55:24 +08:00 via iPhone
    为什么要先写成 curl 命令再解析出来啊?我没这需求。
    guonaihong
        30
    guonaihong  
    OP
       2020-03-15 17:34:36 +08:00
    @ggicci 因果关系是,是先有 curl 的命令(别人提供的),想快速用 go 发射出去。
    0o0O0o0O0o
        31
    0o0O0o0O0o  
       2020-03-15 19:41:10 +08:00 via iPhone
    @guonaihong #24 这句说得我有点混乱了,看你举例的代码不就是要解析 curl 命令行的吗……
    ggicci
        32
    ggicci  
       2020-03-15 20:28:11 +08:00
    @guonaihong 直接用 http 库重写一下这个 curl 请求不就行了?= =|||
    leonme
        33
    leonme  
       2020-03-15 20:31:59 +08:00
    httpie 香
    guonaihong
        34
    guonaihong  
    OP
       2020-03-15 21:08:05 +08:00
    @0o0O0o0O0o 对啊,是要用 go 解析 curl 命令的。
    我们在讨论实现的细节有个分歧。
    你是想用解析 curl---->生成 go 代码的方式。在#24 表达这种方式不太好实现。
    目前倾向于使用 解析 curl---->生成*http.Request

    现在不混乱了吧。
    YanwenSun
        35
    YanwenSun  
       2020-03-15 21:19:24 +08:00
    曾经有计划做一个 curl->php->php curl 发送完整 curl 命令到 php 转换并请求 再带着返回头和内容(如果有)发回来的 proxy
    后来发现最多也就是填几个会用到的 放虚拟主机上简单用用还是蛮方便的
    guonaihong
        36
    guonaihong  
    OP
       2020-03-15 21:41:18 +08:00
    @ggicci 对于你的疑问,换种说话,标准库可以做很多事情。为啥还有这么多的库会出现补充它,不是说标准库不够好,而是做一件事太慢(非运行时,而是编码慢)。
    你说的可以用标准库做,试想下下面的命令要你用 http 库最快要多长时间翻译成 go 代码。
    ```bash
    curl -X POST url -d 'username=yourusername&password=yourpassword'
    curl --request PUT url
    curl -r 0-20000 -o myfile.png url
    curl -F text=good -F voice=@./good.voice url
    ```
    如果不在乎编码慢,我也不知道说啥了。如果在乎还有一例。

    举个远古的例子(快与慢),c 语言为啥什么会代替汇编。大部分原因汇编相比 c 来说编码来说太慢。写个 i++,可能要从栈里移动到寄存器里,用 add 完成自加,mov 再移回去,一个简单的 i++都要撸这么多,试想 for 循环或者写一个函数,这谁吃得消,对吧。历史说过,快的不一定能完全替换慢的,但是快的大多数会流行。

    最后想说:天下武功唯快不破。。。
    guonaihong
        37
    guonaihong  
    OP
       2020-03-15 21:42:47 +08:00
    @YanwenSun 同道中人。我后面想玩个大的,实现大部分 curl 选项。
    guonaihong
        38
    guonaihong  
    OP
       2020-03-15 21:44:01 +08:00
    @leonme httpie 是很香,只是受众比 curl 略低。
    pharaoh168
        39
    pharaoh168  
       2020-03-15 22:25:44 +08:00
    vs code 有一个 REST Client 扩展,可以直接解析和运行 curl,还可以生成各种语音的代码。
    guonaihong
        40
    guonaihong  
    OP
       2020-03-15 23:15:48 +08:00
    @pharaoh168 这个插件名字是?我看下有没有 go 的。如果能实现百分百 curl 选项,我就玩别的。
    ggicci
        41
    ggicci  
       2020-03-15 23:34:50 +08:00
    @guonaihong 所以你就是想用 Go 把 curl 实现一遍???
    guonaihong
        42
    guonaihong  
    OP
       2020-03-15 23:56:33 +08:00
    @ggicci 只实现一个解析库然后生成 go 的*http.Request 对象,然后给别的有此需求的童鞋用下。想加入吗?
    eq06
        43
    eq06  
       2020-03-15 23:58:31 +08:00
    网上一搜一大把,curl 命令转 Python 的 requests 实现,都不用写代码,直接生成给你
    guonaihong
        44
    guonaihong  
    OP
       2020-03-15 23:59:41 +08:00
    @eq06 有 go 的吗?
    scukmh
        45
    scukmh  
       2020-03-16 00:35:09 +08:00   ❤️ 1
    @guonaihong 有 go 语言的我记得,https://curl.trillworks.com/#go
    guonaihong
        46
    guonaihong  
    OP
       2020-03-16 09:34:21 +08:00
    @scukmh 谢谢了,刚刚确认过,支持 multipart 格式有问题。
    可以用下面的命令 curl -F text=good -F voice=good.pcm url 试下就知道。
    vus520
        47
    vus520  
       2020-03-16 11:08:14 +08:00
    @guonaihong

    我刚刚看了你的几个 repo。

    首先说肯定有价值,现在安卓手机上默认是没有 curl 的,curl 要编译要解决各种依赖链和 ssl 的问题,go 的交叉编译能完美解决这个问题。
    guonaihong
        48
    guonaihong  
    OP
       2020-03-17 09:43:55 +08:00
    @vus520 感谢支持。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2043 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 00:43 · PVG 08:43 · LAX 16:43 · JFK 19:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.