Home / Programmazione / C - C++ / Da CURLcode a string in C++
Mattepuffo

Da CURLcode a string in C++

Da CURLcode a string in C++

In questo articolo abbiamo introdotto l'uso di CURL in C++ facendo un esempio di base.

In genere però é più probabile dover trasformare la risposta che ci arriva come oggetto CURLcode, ad esempio in string perchè poi processata.

Ad esempio se ci arriva in JSON (come nel mio caso).

Quindi dobbiamo convertire CURLcode in string.

Per farlo dobbiamo apportare un pò di modifiche; cominciamo dal file .h:

#ifndef READ_H
#define    READ_H

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

using namespace std;

extern "C" int readCurlHelper(char *data, size_t size, size_t nmemb, string *buffer);

class Read {
public:
    Read();
    virtual ~Read();
    void read(string file);
    size_t curlToString(char *data, size_t size, size_t nmemb, string *buffer);
private:
    string response;
    string url;
    CURL *curl;
    CURLcode res;
    struct curl_slist *headers;
};

#endif

Abbiamo aggiunto due funzioni, una interna che si occupa di costruire la stringa, e una esterna che si occupa della conversione.

 

Del perchè abbiamo usato anche una funzione esterna vi rimando alla spiegazione che mi hanno fatto sul forum HTML.it.

Per quanto riguarda il file di implementazione:

#include "read.h"

extern "C" int readCurlHelper(char *data, size_t size, size_t nmemb, string *buffer) {
    Read *that = (Read *) buffer;
    return that->curlToString(data, size, nmemb, NULL);
}

Read::Read() {
    headers = NULL;
    url = "http://www.sito.com/";
}

void Read::read(string file) {
    curl_slist_append(headers, "Accept: application/json");
    curl_slist_append(headers, "Content-Type: application/json");
    curl_slist_append(headers, "charset: utf-8");
    curl = curl_easy_init();
    string completeUrl;
    completeUrl = url.append(file);
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_URL, completeUrl.c_str());
        curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &readCurlHelper);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, this);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        if (res == CURLE_OK) {
            cout << response << endl;
        } else {
            cerr << "Error: " << curl_easy_strerror(res) << endl;
        }
        response.empty();
        response.clear();
    }
}

size_t Read::curlToString(char *data, size_t size, size_t nmemb, string *buffer) {
    response.append(data, size * nmemb);
    return size * nmemb;
}

Read::~Read() {
}

La funzione readCurlHelper altro non fa che processare il buffer e mandarlo alla funzione curlToString, che poi ci permette di costruire il nostro oggetto string.

Se è tutto ok dovremo vedere in console il contenuto della variabile string response.

Diciamo che l'argomento non è dei più facili.

C'è parecchio da studiare, soprattutto per quanto riguarda il funzionamento delle funzioni extern.

Quello che vi posso dire è che abbiamo avuto bisogno di questo "trucco" solo perchè stiamo usando la programmazione a oggetti; se avessimo usato singole funzioni e richiamato tutto nel main senza usare la OOP non ne avremo avuto bisogno.

Ma perchè non complicarsi la vita ogni tanto?