25

cpp 有什么简洁的方案可以时间 http 请求吗?

 3 years ago
source link: https://www.v2ex.com/t/796751
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.
neoserver,ios ssh client

V2EX  ›  C++

cpp 有什么简洁的方案可以时间 http 请求吗?

  woshichuanqilz · 12 小时 1 分钟前 · 2836 次点击

网上找了不少例子在 VisualStudio2019 里面都不能用 系统是 windows

72 条回复    2021-08-20 00:37:47 +08:00

janus77

janus77   11 小时 58 分钟前

curl 不行?

AoEiuV020

AoEiuV020   11 小时 16 分钟前

c++门槛还是这么高吗,一个 http 请求都很麻烦?

nannanziyu

nannanziyu   11 小时 15 分钟前

https://github.com/yhirose/cpp-httplib
A C++11 single-file header-only cross platform HTTP/HTTPS library.

nannanziyu

nannanziyu   11 小时 13 分钟前

@AoEiuV020
> c++门槛还是这么高吗,一个 http 请求都很麻烦?
请先确认前提,再引申结果,从错误前提引申的结果,只能证明自己无知

AoEiuV020

AoEiuV020   11 小时 5 分钟前   ❤️ 1

@nannanziyu 不至于,
要说有没有办法简单实现 http 请求我是一开始就相信有的,
但楼主的意思应该是已经在网上查找过,并且尝试过不少不可行的方案,

这就是前提了,
是说一个简单的 http 请求都能折腾到新手上来问,
而不是说 c++没有办法实现简单的 http 请求,
并没有什么错误,

nannanziyu

nannanziyu   10 小时 58 分钟前

@AoEiuV020
1. 首先 google 关键词 "c++ http library" 第二条结果就是 cpp-httplib
2. 楼主解决问题以及寻找答案的能力差,自己找不到答案,所以来请教,这是没有问题,因为请教也是解决问题的一个方法,至少努力了
但是看到一个错误前提,不花时间思考,条件反射地得出结论,不是解决问题的方法

AoEiuV020

AoEiuV020   10 小时 43 分钟前   ❤️ 10

@nannanziyu 感觉你这是习惯性偷换概念了,
我都说了我前提是楼主已经出来问了,你依然觉得你有解决方案而楼主没有就能说明是楼主不行,不是 c++门槛高,
另外我花了几分钟下载试了一下你说的这个库,甚至没有想像中的方便,这东西还依赖 openssl,不开启 CPPHTTPLIB_OPENSSL_SUPPORT 就不支持 https,开启了没有 openssl 就报错,
像我这种能力差的依然不能简单利用起来实现 http 请求,说一句“c++门槛还是这么高” 没毛病吧,

shawnsh

shawnsh   10 小时 37 分钟前 via Android

确实没有 modern cpp 风格的好用的 http 库

ztcaoll222

ztcaoll222   10 小时 19 分钟前

ipwx

ipwx   10 小时 13 分钟前

@AoEiuV020 你说的很对,C++ 的库安装,在 VS 下就是忒麻烦。

所以我用 linux + cmake + conan.io 。这真的无痛,什么 openssl 、cpp-httplib 、libcurl 都是一键安装,直接运行

wutiantong

wutiantong   10 小时 0 分钟前

@ipwx vcpkg 不香吗?

jpacg

jpacg   9 小时 59 分钟前

c/c++用别人的轮子都麻烦,特别是在 Windows 下。

Otho

Otho   9 小时 49 分钟前

vcpkg + cpprest Qt 的也不是很好用。

nannanziyu

nannanziyu   9 小时 1 分钟前   ❤️ 7

@AoEiuV020
好,我来把解决“cpp 解决 http 请求”的整个流程列一下,你说说哪个步骤门槛高
1. 要做 http 请求,肯定找一下相关库,所以用 google 搜索 "c++ http library",第二条结果就是 cpp-httplib
2. 进入 cpp-httplib github 主页,花两分钟看下文档,ok,需要 “SSL support is available with CPPHTTPLIB_OPENSSL_SUPPORT. libssl and libcrypto should be linked.”
3. 尝试寻找 windows openssl library,使用 google 搜索 "windows openssl library download",同样第二条结果就是

4. 点击第二条进入 Openssl Binaries 下载主页
页面仔细看一下就知道下哪个。就算不知道在页面里搜索 library,一共三条结果,排除掉第二个 for ICS 的,一共就两个,下载下来

5. 把下载的 lib 和 headers 加入工程,实例代码拷贝一下,F5


你说说这里哪个门槛高?也只有第五步需要有一点点 L l IncludePath 的概念,但是连 IncludePath 也叫门槛吗?

araraloren

araraloren   8 小时 58 分钟前

你说的网上是 CSDN 吗???????

nannanziyu

nannanziyu   8 小时 56 分钟前

说实话,我之前都是用 cpprestsdk 和 QT 的,因为楼主要“简单方案”,所以今天是第一次接触 cpp-httplib
上面全部尝试过程都是"第一次接触",然后“尝试解决问题”的过程
程序员这个行业,搜索资料,尝试解决问题的能力是很重要的
如果觉得这个都有门槛,我真心觉得需要提升一下自己

bthulu

bthulu   8 小时 46 分钟前

可以安装 nodejs, c++动态生成 http 的 js 代码, 调用 cmd 脚本执行, 再读取控制台返回数据流即可

AoEiuV020

AoEiuV020   8 小时 45 分钟前

@nannanziyu 一个简单的 http 请求,甚至不能复制粘贴运行直接搞定,还要谷歌搜索两次,还要看文档,还要下载合适的库,还要正确的引用库,这就是门槛,

AoEiuV020

AoEiuV020   8 小时 43 分钟前

@AoEiuV020 #18 这个流程已经可以用于“实现任何功能”了,然而仅仅是一个“简单的 http 请求”就需要这么麻烦的操作,你的门槛是被踩碎了吧,巨人,

nmap

nmap   8 小时 39 分钟前   ❤️ 1

这种问题自己 google 两分钟就搞定的事,还拿来问,还引来大佬们的骂架。。。

sanyuedev

sanyuedev   8 小时 37 分钟前

Java 开发 弱弱的问一下 C++ 用 http 是不是没有库的话要自己解析 socket ..

jorneyr

jorneyr   8 小时 35 分钟前

封装了 Qt 的 Http 请求,调用方式如下,参考 http://qtdebug.com/qtbook-network-http-httpclient/

HttpClient("http://localhost:8080/api/rest").success([](const QString &response) {
qDebug().noquote() << response;
}).get();

// [3] POST 请求,使用 param 添加参数,请求的参数使用 Form 格式
HttpClient(url).debug(true).param("name", "卧龙").param("value", 99).success([](const QString &response) {
qDebug().noquote() << response;
}).post();

encro

encro   8 小时 35 分钟前

@AoEiuV020
@nannanziyu

门槛是相对的,

但是 C++门槛高是公认的,也是不会去重点改善的,看过作者原著的人应该都会有这个认识吧。

跨平台多字节处理就会搞死一批人,到 20 还没解决,提案到解决还要好几年吧。

如果 C++门槛低了,就没 Rust,C,GO,Python 一堆语言什么事了吧?

nannanziyu

nannanziyu   8 小时 33 分钟前   ❤️ 1

@AoEiuV020
还是说,如果你看完流程,还觉得是门槛的话
如果你是学生:没关系,慢慢提升
如果你工作年限 2 年内:先不要 leetcode 和背题了,尝试找些稍微大的项目,尝试完整实现,在尝试过程中,逐渐提升自己的“搜索资料,尝试解决问题的能力”,这是你的瓶颈
如果你工作年限在 2-3 年内:尝试考公吧,换工作还来得及
如果你工作年限在 3 年外:只能说一句晚安了

lucays

lucays   8 小时 28 分钟前

如果这么一个请求都要三年经验,还不算门槛么?

Rheinmetal

Rheinmetal   8 小时 24 分钟前

@nannanziyu
有这个流程 java 和 node 已经用脚手架把项目搭起来了
天下底层开发者苦 cpp 久矣

LotusChuan

LotusChuan   8 小时 17 分钟前   ❤️ 1

这是把自己的能力高低给当最低标准了吗。还是主要目的是进来给别人规划人生。

nannanziyu

nannanziyu   8 小时 16 分钟前   ❤️ 2

@Rheinmetal
语言是工具,每种工具都有适合自己的地方
java 和 node 用 cli 把项目搭起来之前,curl 已经把结果展示在控制台上了
并不能说明 java 和 node 门槛比 curl 高
c++ 门槛不高,可以当 C with class 来写;门槛也可以高,写自己都看不懂的模板
这个简单的实现一个 http 请求的门槛不高

bfdh

bfdh   8 小时 9 分钟前   ❤️ 1

curl --libcurl 甚至能帮你把 demo 写了。

benzalus

benzalus   8 小时 4 分钟前

主要是门槛的一个定义问题。对我来说,门槛大概是开箱即用的程度。像 python 3 句话搞定的,c++和这些比起来门槛就相对较高了
怎么搞的跟辩论赛似的

ysc3839

ysc3839   7 小时 46 分钟前

@AoEiuV020 #18
你说不能复制粘贴搞定,理论上配合第三方库是可行的。
前面 @nannanziyu 提到的 cpp-httplib 就已经是 header-only 的库,已经不需要你自己去折腾编译了,主要问题是那个库没有适配各个操作系统原生的 TLS API,而是省事直接用了个外部库,因此多了那几步,本质是看有没有别人帮你封装好,与语言无关。
但如果你想说别的语言都内置 http 库了,C++ 还没内置,所以门槛高,那你的结论是对的,因为 C++ 的标准委员会就是这个风格。但是在这个问题下说这个并没有意义,你只是把大部分 C++ 用户都知道的事实复述了一遍,对解决问题毫无帮助。

wevsty

wevsty   7 小时 37 分钟前

首先,我觉得理解 include 、link 、lib 是 c/cpp 的基本功,这不需要几年的工作经验来学习,也完全不是什么高门槛。
任何语言都面临怎么使用库的问题,不能说因为默认没有某某库就说这个语言的使用门槛高。

cpp 与其说门槛高,不如说是上限高。
毕竟你可以选择把 cpp 写成简单的 C 代码或者 C with class,也可以适当使用 cpp 的特性写出一些简单易懂的模板。
毕竟没有规则强迫你必须写成精品代码,也不必把模板写成谁也看不懂的样子。

AoEiuV020

AoEiuV020   7 小时 34 分钟前

@ysc3839 你这个说的没错,
”你只是把大部分 C++ 用户都知道的事实复述了一遍,“
然而真有人不知道,还怼我,这就让我不爽了,

另外,”对解决问题毫无帮助。“
我的确不是来解决问题的,让我做的话应该会引用 libcurl, 我并不知道更简单的,所以没有回答问题,

hankleeeeeee

hankleeeeeee   7 小时 33 分钟前

www5070504

www5070504   7 小时 27 分钟前

@AoEiuV020 跟他们抬杠就已经落下风了 还是不理就好了

ZXCDFGTYUZXCDFGTYU   7 小时 24 分钟前

这不就是个 HTTP 服务端和客户端的 C++实现的问题么。。这两个问题随便哪个百度一下得到答案的所需时间成本超过 15 分钟?不明白这吵来吵去 30 多层楼的意义。。

nannanziyu

nannanziyu   7 小时 24 分钟前   ❤️ 2

@AoEiuV020
你要复制粘贴的方法? OK
1. VS 新建一个 Cpp console 工程,工程右键 -> Manage nuget packager
2. 搜索 cpprestsdk,并 点击 install

3. 复制以下代码替换 main.cpp ,然后 F5

#include <iostream>
#include <cpprest/http_client.h>
int main()
{
web::http::client::http_client client(U("https://postman-echo.com/get?a=b"));
auto rsp = client.request(web::http::methods::GET).get();
auto body = rsp.extract_string().get();
std::wcout << rsp.status_code() << "\n" << body << std::endl;
}

l00t

l00t   7 小时 11 分钟前

@ipwx conan 本身配置就挺麻烦的啊,cmake 也是得自己写,距离一键还远。

OneMan

OneMan   7 小时 11 分钟前

c++确实门槛高,搞个什么 http,ssl 最烦了

casioyan

casioyan   7 小时 10 分钟前

@nannanziyu 如果这是一个公司内部技术讨论群,我觉得你这么说无可厚非,在论坛上只会让人觉得恶臭。

nannanziyu

nannanziyu   7 小时 10 分钟前

为什么一开始不提供 cpprestsdk 的方法
因为楼主要简洁的方案
cpprestsdk 的门槛比 cpp-httplib 高的多得多得多,cpprestsdk 的模板代码没有 10 年工作经验看不懂;即使不看源代码只使用,因为 cpprestsdk 基于 pplx,天生异步 task,对于新手来说难度很高
而 cpp-httplib 更适合新手,只要有一点 cpp 基础,就能使用
门槛和简易度是没有关系的

hangs

hangs   7 小时 3 分钟前

楼主不会是参考的某*SDN 的吧。C++虽说有门槛,但我不认为没有开箱可用的 library 就算高门槛,只能算是繁琐吧

lc1450

lc1450   6 小时 54 分钟前

@nannanziyu #14 进了第一条链接,然后出不来了🐶

nannanziyu

nannanziyu   6 小时 52 分钟前

@lc1450 那看下 #37 吧,#37 没有链接,不会监禁人 🐶

buddyy

buddyy   6 小时 51 分钟前   ❤️ 1

啊哈哈哈,笑死我了🤣

AoEiuV020

AoEiuV020   6 小时 40 分钟前 via Android

@nannanziyu 自信一点,求你了,不要以为你能跨过的都不是门槛,你没有那么 low,

br00k

br00k   6 小时 39 分钟前

感觉对比其它语言来说还是比较麻烦的,特别跨平台的时候感觉多了很多坑。
😂习惯了包管理,添加依赖以后就可以随便写了。

nannanziyu

nannanziyu   6 小时 33 分钟前   ❤️ 3

@AoEiuV020
新建工程,内置包管理点一下,复制粘贴 F5,真的算门槛吗?
我自问从头到尾都是好好说话,诚心帮助人,你句句杠字字刺,何苦呢
我也马上快四十了,见过的人里,脾菜比(脾气 /菜)你也算在前五了

nannanziyu

nannanziyu   6 小时 28 分钟前   ❤️ 1

一幅图送你,与君共勉,晚安

OxOzZ

OxOzZ   6 小时 24 分钟前

看到快 40,马上就跟某种刻板印象匹配了,这帖子一下子合理了

AoEiuV020

AoEiuV020   6 小时 15 分钟前 via Android   ❤️ 1

@nannanziyu 你还是去睡觉吧,你没怎么见过我这样的,可你这样的我倒是在游戏区见过不少,提起魂类游戏就说简单的一匹,无伤就能打赢的 boss 有什么难的,就是你这种了,

bestwaytowait

bestwaytowait   6 小时 11 分钟前

相比于其它语言就是门槛高啊,这话没什么问题。还有 cpp 的包管理,相比其它一些语言的普及广度,使用深度,就是差很多啊,也没什么问题

zxCoder

zxCoder   6 小时 9 分钟前

看了半天楼上的讨论,所以 c++粉丝到底是希望门槛高好还是门槛低好啊

lingxi27

lingxi27   6 小时 1 分钟前

门槛确实是相对的,对于一个 c++程序员来说楼主的问题还不至于称为门槛

LANB0

LANB0   5 小时 52 分钟前

对于需要往各种硬件平台移植各种库的开发者来说,我需要有一个可以按照各硬件平台依赖的包管理

zmxnv123

zmxnv123   5 小时 52 分钟前

y1s1,c++相对于 Java, Python 引入库确实麻烦。

pengtdyd

pengtdyd   5 小时 44 分钟前

睡觉,睡觉,我一个 java 程序员不掺和 cpp 的讨论

nicevar

nicevar   5 小时 29 分钟前   ❤️ 1

@nannanziyu 你跟那种嘴巴厉害解决不了问题的人杠没意思,一个写 c++的,弄个 http 请求都算门槛的话,那门槛是平的了

zhoujinjing09

zhoujinjing09   5 小时 17 分钟前   ❤️ 1

yysy 现代语言好像只有 C++标准库做不了这个事情要另外引入包

darknoll

darknoll   5 小时 0 分钟前

c++这玩意,我司用了十年都转其他语言了

Hallelu

Hallelu   4 小时 3 分钟前 via iPhone

http 这块说实话对于稍微有经验的 c++来说,不是啥问题,随便在搜个库,编译配置依赖头文件链接就能用了,如果是 go,python 转过来要使用相对来说比 c++转到 go,python 使用 http 门槛高多了,毕竟人家就一句 http.Get()就完事了 :)没办法 这块是硬伤

darer

darer   3 小时 59 分钟前

@nannanziyu 图不错 有原图吗(

FACEB00K

FACEB00K   3 小时 55 分钟前

boost 和 Qt 随便用

iyear

iyear   3 小时 32 分钟前

可以,看吵架还学到了不少,自己还心情愉悦,血赚

AoEiuV020

AoEiuV020   3 小时 30 分钟前 via Android

@Hallelu 有经验了还谈什么门槛?门槛栏的是入门前的,搜个库,编译配置依赖头文件链接哪一步都不是入门前该会的,

jdz

jdz   3 小时 22 分钟前 via Android

mrsecond

mrsecond   3 小时 3 分钟前

还是用 Qt 的 QNetWorkAccessManager 吧,全面而且好用点

fzcf

fzcf   2 小时 44 分钟前

到现在难道没发现楼主一句话没说嘛。难道这是引战贴???🤓️

ufan0

ufan0   2 小时 28 分钟前

Blue DO 的同学发言一开始就是站在制高点,像极了一般的小 TL 。

友好交流是基础,而不是上来就是“只能证明自己无知”。

LotusChuan

LotusChuan   1 小时 8 分钟前 via iPhone

回头来看这是引战的吗。这需求就算是在 stackoverflow 里面也能直接搜出来,都不用自己提问。就算是不行也好歹把哪不行给提出来吧。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK