Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use libcurl in c++ to send a POST request and receive it?

Tags:

I am using the c++ libcurl to send a POST request to a webpage, but i am struggling test it. The code is use is:

#include <stdio.h>
#include <curl/curl.h>
#include <string>
using namespace std;
int main(void)
{
    CURL *curl = curl_easy_init();
    if(curl) {
        const char *data = "submit = 1";

        curl_easy_setopt(curl, CURLOPT_URL, "http://10.5.10.200/website/WebFrontend/backend/posttest.php");

        /* size of the POST data */
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 10L);

        /* pass in a pointer to the data - libcurl will not copy */
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);

        curl_easy_perform(curl);
    }


    /* Perform the request, res will get the return code */ 




    /* always cleanup */ 



    return 0;
}

This is the sample code from: https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html

The outcome really confuses me. From the terminal I can see there is POST request been sent but from the web page i cannot retrieve any data. The web page is very simple php code that prints out the $_POST. terminal screenshot and webpage screenshot

Could anyone help me with this? Why i cannot get the POST request from the web page, and how can i fix this? Anyone can give me a better way to test the code? Thank you guys so much!

like image 220
Vic Avatar asked Jul 13 '18 03:07

Vic


People also ask

How would you use curl to make a POST request?

To make a POST request with Curl, you can run the Curl command-line tool with the -d or --data command-line option and pass the data as the second argument. Curl will automatically select the HTTP POST method and application/x-www-form-urlencoded content type for the transmitted data.

What is libcurl in C?

libcurl is a library of functions that are provided with a C API, for applications written in C. You can easily use it from C++ too, with only a few considerations (see libcurl for C++ programmers).

What can you do with libcurl?

libcurl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, HTTP/2, HTTP/3, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, Kerberos), file transfer resume, http proxy tunneling and more!

How do you call a POST in curl?

Users can send data with the POST request using the -d flag. The following POST request sends a user and a pass field along with their corresponding values. POSTing with curl's -d option will include a default header that looks like: Content-Type: application/x-www-form-urlencoded .


1 Answers

You have to implement a callback function that will be called by curl at every batch of data received.

See a good example here :

https://gist.github.com/alghanmi/c5d7b761b2c9ab199157#file-curl_example-cpp

Obviously you replace the simple string by whatever data type and treatment you need in the WriteCallback() function.

Copy/paste of alghanmi's example :

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


static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main(void)
{
  CURL *curl;
  CURLcode res;
  std::string readBuffer;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    std::cout << readBuffer << std::endl;
  }
  return 0;
}

Also, you'll find a good tutorial here.

like image 199
FabioB Avatar answered Sep 28 '22 17:09

FabioB