Сообщение HTTP для создания базы данных InfluxDB с помощью libcurl

Я пытаюсь сделать http пост с библиотекой libcurl для создания базы данных InfluxDB, как указано на их сайте:

curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb"

Похоже, мой код не работает. Это не дает мне никаких ошибок, но БД не создается. Но вместо этого, если я пытаюсь добавить некоторые точки в существующую базу данных, с той же функцией, это работает. Я думаю, что мне не хватает правильного способа добавления части «q = CREATE DATABASE mydb». Как я должен изменить свой код?

int main(int argc, char *argv[]){

char *url = "http://localhost:8086/query";
char *data = "q=CREATE DATABASE mydb";
/* should i change data string to json?
data = "{\"q\":\"CREATE DATABASE mydb\" }" */

bool res = createInfluxDB(url, data);

/*control result*/

return(0);
}

bool createInfluxDB(char *url, char *data) {
CURL *curl;

curl = curl_easy_init();

if(curl) {
CURLcode res;
/* What Content-type should i use?*/
struct curl_slist* headers = curl_slist_append(headers, "Content-Type: application/json");
/*--data-urlencode*/
char *urlencoded = curl_easy_escape(curl, data, int(strlen(data)));

curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, urlencoded);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(urlencoded));

res = curl_easy_perform(curl);

/*omitted controls*/

curl_free(urlencoded);
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}

return(true);
}

1

Решение

После анализа пакетов с помощью http post-запроса (который возвращал Bad Request) я пришел к тому, что не следует добавлять параметры запроса в качестве данных. Но вместо этого он должен быть частью URL. Так что после такого изменения кода это работает!

int main(int argc, char *argv[]){

char *url = "http://localhost:8086/query?q=CREATE+DATABASE+mydb";
bool res = createInfluxDB(url);

/*control result*/

return(0);
}

bool createInfluxDB(char *url) {
CURL *curl;

curl = curl_easy_init();

if(curl) {
CURLcode res;
struct curl_slist* headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded");

curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

res = curl_easy_perform(curl);

/*omitted controls*/

curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}

return(true);
}
1

Другие решения

Отредактированный ответ:

У вас все еще есть пропущенная переменная в условии if:

if (urlencode) free(...

Которые должны быть

if (urlencoded) free(...

Затем в своих заголовках вы устанавливаете тип приложения как json, и я не думаю, что вы этого хотите.
Что-то вроде «application / x-www-form-urlencoded» может быть лучше.

struct curl_slist* headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded");

ОРИГИНАЛЬНЫЙ ОТВЕТ:

Обходной путь может быть в вашем

char *data = curl_easy_escape(curl, json, int(strlen(json)));

Тот перегрузка данные с JSON вар что не существует?

Нечто подобное может работать лучше:

data = curl_easy_escape(curl, data, int(strlen(data)));
0

По вопросам рекламы [email protected]