问卷调查:如果实现解析 curl 命令的库,大家感兴趣吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
guonaihong
V2EX    Go 编程语言
<1>问卷调查:如果实现解析 curl 命令的库,大家感兴趣吗?
  •  
  •   guonaihong
    guonaihong 2020-03-15 09:37:03 +08:00 5390 次点击
    这是一个创建于 2088 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问卷调查

    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 这边没找到类似的
    4BVL25L90W260T9U
        5
    4BVL25L90W260T9U  
       2020-03-15 10:52:28 +08:00
    guonaihong
        6
    guonaihong  
    OP
       2020-03-15 10:6: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 请求不就行了?= =|||
    leon0318
        33
    leon0318  
       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     Solana     2703 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 14:54 PVG 22:54 LAX 06:54 JFK 09:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86