在C項目中,我們經常需要從外部獲取數據,并將數據進行處理。對于需要保密的數據,可以使用https協議來保護數據的傳輸安全。而對于傳輸的數據格式,JSON成為了一種廣泛使用的格式。下面我們來介紹如何在C中調用https服務,獲取JSON格式的數據。
我們可以使用openssl庫來實現https的請求。首先,我們需要導入openssl頭文件,并在代碼中初始化openssl:
#include <openssl/ssl.h> #include <openssl/err.h> SSL_load_error_strings(); SSL_library_init();
然后,我們需要建立與https服務端的連接,可以使用以下代碼實現:
int sockfd; struct sockaddr_in servaddr; struct hostent *server; SSL_CTX *ssl_ctx; SSL *ssl; char *host = "example.com"; char *port = "443"; sockfd = socket(AF_INET, SOCK_STREAM, 0); server = gethostbyname(host); memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; bcopy((char *)server->h_addr_list[0], (char *)&servaddr.sin_addr.s_addr, server->h_length); servaddr.sin_port = htons(atoi(port)); connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); ssl_ctx = SSL_CTX_new(TLS_client_method()); ssl = SSL_new(ssl_ctx); SSL_set_fd(ssl, sockfd); SSL_connect(ssl);
這里我們需要替換host和port為我們所需要連接的https服務的地址和端口號。
接下來,我們可以向https服務發送請求。以GET請求為例:
char *request = "GET /api/data HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n"; SSL_write(ssl, request, strlen(request));
這里我們需要替換請求路徑為我們所需要的路徑。
最后,我們可以讀取https服務返回的JSON數據:
int buflen = 2048; char buf[buflen]; char *content; int contentlen = 0; int contentbuflen = buflen; while (1) { int n = SSL_read(ssl, buf, buflen); if (n >0) { content = realloc(content, contentlen + n); memcpy(content + contentlen, buf, n); contentlen += n; contentbuflen += buflen; content = realloc(content, contentbuflen); } else { break; } } printf("%s", content);
這里我們需要根據需要修改buflen的大小,以及根據實際讀取的數據長度對content進行realloc操作。
上一篇c 讀取配置json