这是我的问题,我想制作一个iOS应用程序,使用Objective-C++(我主要用C++和SDL编写代码)发出https(而不仅仅是http)请求,但我不知道如何做到这一点。
我只是想从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
都不见了,所以我加了krzyzanowskim的
OpenSSL v1.1.2100
作为我的xCode项目中的包依赖项,按照github存储库上的指示使用Swift Package Manager:
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;
OUTPUT(输出)(注意
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;
}
OUTPUT(结果正确,
see
):
7F83B1657FF1FC53B92DC18148A1D65DFC2D4B1FA3D677284ADDD200126D9069
我是不是错过了一些显而易见的东西?我不明白为什么cpp-httplib不能工作,而OpenSSL似乎按预期工作。。。