代码之家  ›  专栏  ›  技术社区  ›  MrRicKsPC

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

  •  0
  • MrRicKsPC  · 技术社区  · 2 年前

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

    0 回复  |  直到 2 年前