Gửi một yêu cầu HTTP

C:
Gửi một yêu cầu HTTP

Làm thế nào:

Để gửi một yêu cầu HTTP trong C, bạn sẽ chủ yếu dựa vào các thư viện như libcurl, vì C không có hỗ trợ sẵn cho các giao thức web. Dưới đây là một ví dụ đơn giản sử dụng libcurl để thực hiện một yêu cầu GET:

Đầu tiên, hãy chắc chắn bạn đã cài đặt libcurl trên hệ thống của mình. Sau đó, bao gồm các tiêu đề cần thiết và liên kết với thư viện libcurl trong file mã nguồn của bạn:

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

int main(void) {
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init(); // Khởi tạo một tay cầm libcurl
    if(curl) {
        // Thiết lập URL mà nhận tay cầm libcurl
        curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
        // Định nghĩa một hàm gọi lại để lấy dữ liệu
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); 
        
        // Thực hiện yêu cầu, res sẽ nhận mã trả về
        res = curl_easy_perform(curl);
        // Kiểm tra lỗi
        if(res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                    curl_easy_strerror(res));

        // Luôn luôn dọn dẹp
        curl_easy_cleanup(curl);
    }
    return 0;
}

Biên dịch với lệnh tương tự gcc -o http_request http_request.c -lcurl, chạy nó sẽ thực hiện một yêu cầu GET đơn giản đến “http://example.com”.

Đầu ra mẫu

Vì ví dụ không xử lý phản hồi từ máy chủ, việc chạy nó sẽ không tạo ra đầu ra hiển thị nào ngoài các thông báo lỗi tiềm năng. Việc tích hợp hàm gọi lại để xử lý dữ liệu nhận được là cần thiết cho sự tương tác ý nghĩa.

Đào sâu

Ý tưởng gửi yêu cầu HTTP từ một chương trình C dựa trên khả năng mạng mạnh mẽ của ngôn ngữ, kết hợp với các thư viện bên ngoài vì chính C là một ngôn ngữ cấp thấp không hỗ trợ sẵn các giao thức internet cấp cao. Lịch sử, các lập trình viên sẽ tự mình sử dụng lập trình socket trong C, một quy trình phức tạp và mệt mỏi, để tương tác với các máy chủ web trước khi có sự ra đời của các thư viện chuyên dụng như libcurl.

Libcurl, được xây dựng dựa trên C, đơn giản hóa quy trình, che khuất những chi tiết sâu cay của lập trình socket và đặc điểm giao thức HTTP. Nó hỗ trợ nhiều giao thức ngoài HTTP/HTTPS, bao gồm FTP, SMTP, và hơn nữa, làm cho nó trở thành một công cụ đa năng cho lập trình mạng trong C.

Mặc dù việc sử dụng libcurl cho các yêu cầu HTTP trong C là thực tiễn, lập trình hiện đại thường hướng đến các ngôn ngữ hỗ trợ sẵn công việc này, như Python (thư viện requests) hay JavaScript (API Fetch). Những lựa chọn thay thế này cung cấp cú pháp đơn giản hơn, dễ đọc hơn nhưng phải đánh đổi điều khiển tỉ mỉ và các tối ưu hoá hiệu suất có thể có trong C thông qua việc điều khiển trực tiếp socket và việc sử dụng thư viện một cách tinh tế.

Đối với các ứng dụng hiệu suất quan trọng hoặc khi cần tương tác trực tiếp với hệ thống cấp thấp, C vẫn là một lựa chọn khả thi, đặc biệt với libcurl làm giảm bớt phức tạp của giao tiếp web. Tuy nhiên, cho hầu hết các tương tác web cấp cao, việc khám phá các ngôn ngữ lập trình web chuyên biệt có thể chứng minh hiệu quả hơn.