如何使用 xCode 从 Objective-C++ iOS 应用程序发出 https 请求?

问题描述 投票:0回答:0

这是我的问题,我想制作一个 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 似乎按预期工作......

ios openssl httprequest objective-c++ httplib
© www.soinside.com 2019 - 2024. All rights reserved.