这是我的问题,我想制作一个 iOS 应用程序,它将使用 Objective-C++ 发出 https(而不仅仅是 http)请求(我主要使用 SDL 使用 C++ 进行编码),但我不知道该怎么做。 我只是想从 https 网站检索 html 代码以在我的应用程序中使用它们。
有人可以向我解释如何实现这一目标吗?或者至少告诉我我在尝试中做错了什么。
在我的尝试中,我发现了 yhirose 的纯标头和跨平台库 cpp-httplib,当我发出简单的 http 请求时,它就像一个魅力。
现在就像我说的,我也想发出 https 请求,但这就是它变得困难的地方,因为它需要 OpenSSL。
首先,我在包含
CPPHTTPLIB_OPENSSL_SUPPORT
之前定义了 httplib.h
,因此它使用 openssl:
#define CPPHTTPLIB_OPENSSL_SUPPORT
#include "httplib.h"
从那里开始,
openssl/err.h
、openssl/evp.h
、openssl/ssl.h
和openssl/x509v3.h
丢失了,所以我按照github上的说明使用Swift Package Manager在我的xCode项目中添加了krzyzanowskim的OpenSSL v1.1.2100作为包依赖项存储库:
dependencies: [
.package(url: "https://github.com/krzyzanowskim/OpenSSL.git", .upToNextMinor(from: "1.1.1700"))
]
现在应用程序编译得很好,但是当我尝试发出 https 请求时,
httplib::Result
无法使用,并且在尝试访问其主体或其状态时出现运行时错误 Thread 1: EXC_BAD_ACCESS (code=1, address=0x18)
:
// HTTPS
httplib::Client cli("https://stackoverflow.com");
httplib::Result res = cli.Get("/questions");
std::cout << "--------------- RESULT ---------------" << std::endl;
std::cout << res << std::endl;
std::cout << "--------------- ERRORS ---------------" << std::endl;
std::cout << res.error() << std::endl;
std::cout << "--------------- STATUS ---------------" << std::endl;
std::cout << res->status << std::endl;
std::cout << "---------------- BODY ----------------" << std::endl;
std::cout << res->body << std::endl;
std::cout << "--------------------------------------" << std::endl;
输出(注意
SSL server verification failed
错误):
--------------- RESULT ---------------
0
--------------- ERRORS ---------------
SSL server verification failed (10)
--------------- STATUS ---------------
(lldb) <-- [Thread 1: EXC_BAD_ACCESS (code=1, address=0x18)]
请注意,常规 http 请求仍然有效(尽管我从大多数网站得到
301 Moved Permanently
,这是正常的):
// HTTP
httplib::Client cli("http://stackoverflow.com");
httplib::Result res = cli.Get("/questions");
std::cout << "--------------- RESULT ---------------" << std::endl;
std::cout << res << std::endl;
std::cout << "--------------- ERRORS ---------------" << std::endl;
std::cout << res.error() << std::endl;
std::cout << "--------------- STATUS ---------------" << std::endl;
std::cout << res->status << std::endl;
std::cout << "---------------- BODY ----------------" << std::endl;
std::cout << res->body << std::endl;
std::cout << "--------------------------------------" << std::endl;
输出:
--------------- RESULT ---------------
1
--------------- ERRORS ---------------
Success (no error) (0)
--------------- STATUS ---------------
301
---------------- BODY ----------------
--------------------------------------
我想象我的 OpenSSL 包出了问题(也许因为它是一个 swift 包?),所以我通过制作一个简单的哈希方法来测试这个理论,它按预期工作,所以我得出结论它很好:
#include <iostream>
#include <openssl/sha.h>
std::string hashWithSha256(std::string input)
{
std::string output = "";
unsigned char buffer[32];
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, input.c_str(), input.size());
SHA256_Final(buffer, &sha256);
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++)
output += buffer[i];
return output;
}
int main( int argc, char* args[] )
{
std::string input = "Hello World!";
std::string output = hashWithSha256(input);
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++)
printf("%02hhX", output[i]);
return 0;
}
输出(结果正确,参见):
7F83B1657FF1FC53B92DC18148A1D65DFC2D4B1FA3D677284ADDD200126D9069
我遗漏了一些明显的东西吗?我不明白为什么 cpp-httplib 不起作用,而 OpenSSL 似乎按预期工作......