libcurl 사용법

By | 2022년 1월 31일
Table of Contents

libcurl 사용법

콜백 방식으로 작동하는 라이브러리이다.

콜백 함수에서 리턴 데이타를 메모리 또는 파일로 저장할 수 있다.

콜백 함수를 지정하지 않으면 stdout 으로 리턴 데이타가 출력된다.

install

sudo apt-get install libcurl4-openssl-dev

사용법

METHOD : GET

#include <stdio.h>
#include <curl/curl.h>

int main() {

    char *url_post = "https://google.com/";
    char *url_get = "https://google.com/";

    CURL *curl;
    CURLcode res;
    curl = curl_easy_init();

    struct curl_slist *list = NULL;

    // =========================================
    // METHOD : GET
    if(curl) {

        // URL
        curl_easy_setopt(curl, CURLOPT_URL, url_get);

        // METHOD
        // DEFAULT : GET

        // EXECUTE
        res = curl_easy_perform(curl);

        curl_easy_cleanup(curl);

        // callback 함수가 없으면 stdout 으로 출력된다.
    }
}

METHOD : POST

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

int main() {

    char *url_post = "https://google.com/";
    char *url_get = "https://google.com/";

    CURL *curl;
    CURLcode res;
    curl = curl_easy_init();

    struct curl_slist *list = NULL;

    curl = curl_easy_init();

    // =========================================
    // METHOD : POST
    if(curl) {

        list = NULL;

        // URL
        curl_easy_setopt(curl, CURLOPT_URL, url_post);

        // METHOD
        curl_easy_setopt(curl, CURLOPT_POST, 1L);

        // HEADERS
        list = curl_slist_append(list, "Content-Type: application/json");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);

        // SSL
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1L);

        // DATA
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "data");

        // EXECUTE
        res = curl_easy_perform(curl);

        curl_easy_cleanup(curl);

        // callback 함수가 없으면 stdout 으로 출력된다.
    }
}

METHOD : POST & CALLBACK

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

struct MemoryStruct {
    char *memory;
    size_t size;
};

size_t write_to_memory_callback(void *buffer, size_t size, size_t nmemb, void *userp) {

    size_t realsize = size * nmemb;
    struct MemoryStruct *mem = (struct MemoryStruct *) userp;
    char *ptr = (char *) realloc(mem->memory, mem->size + realsize + 1);

    if(!ptr) {
        printf("not enough memory (realloc returned NULL)\n");
        return 0;
    }

    mem->memory = ptr;
    memcpy(&(mem->memory[mem->size]), buffer, realsize);
    mem->size += realsize;
    mem->memory[mem->size] = 0;

    return realsize;
}

int main() {

    char *url_post = "https://google.com/";
    char *url_get = "https://google.com/";

    CURL *curl;
    CURLcode res;
    curl = curl_easy_init();

    struct curl_slist *list = NULL;

    // =========================================
    // METHOD : POST & CALLBACK
    if(curl) {

        list = NULL;

        struct MemoryStruct chunk;
        chunk.memory = (char *) malloc(1);
        chunk.size = 0;

        // URL
        curl_easy_setopt(curl, CURLOPT_URL, url_post);

        // METHOD
        curl_easy_setopt(curl, CURLOPT_POST, 1L);

        // HEADERS
        list = curl_slist_append(list, "Content-Type: application/json");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);

        // SSL
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1L);

        // DATA
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "data");

        // CALLBACK
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_to_memory_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) &chunk);

        // EXECUTE
        res = curl_easy_perform(curl);

        curl_easy_cleanup(curl);

        if (chunk.size > 0) {
            printf("111111111 : %s", chunk.memory);
        }
        free(chunk.memory);
    }
}

실행하기

gcc test2.c -lcurl
./a.out

답글 남기기