Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Convert curl request

Convert curl request

Scheduled Pinned Locked Moved C / C++ / MFC
jsonc++questionlearning
13 Posts 3 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • _ _Flaviu

    Hmm ... I tried:

    FILE* pipe = _popen("curl --header \"x-api-key:ABCD\" -s https://api.test.se/api/mydata", "r");

    while (true)
    {
    	pipe->\_Placeholder;
    	break;
    }
    
    fclose(pipe);
    

    but I cannot retrieved any data from pipe ...

    K Offline
    K Offline
    k5054
    wrote on last edited by
    #4

    using a C style FILE * you have to use C stdio functions. So for example you could do

    #include
    #include

    FILE *pipe = popen( ... );

    char *buff = NULL;
    size_t blen = 0;
    while( getline(&buff, &blen, pipe) > 0) {
    // process input data in buff;
    }
    free(buff);

    I generally prefer getline() to fgets() when using cstdio because it allocates and grows the input buffer as needed. If you wish to stick with a more C++ style interface, then maybe look into [Boost.Process](https://www.boost.org/doc/libs/1\_79\_0/doc/html/process.html) I think you've mentioned QT as part of your framework, so there's [QProcess](https://doc.qt.io/qt-6/qprocess.html) as well.

    Keep Calm and Carry On

    _ 1 Reply Last reply
    0
    • _ _Flaviu

      Hmm ... I tried:

      FILE* pipe = _popen("curl --header \"x-api-key:ABCD\" -s https://api.test.se/api/mydata", "r");

      while (true)
      {
      	pipe->\_Placeholder;
      	break;
      }
      
      fclose(pipe);
      

      but I cannot retrieved any data from pipe ...

      L Offline
      L Offline
      Lost User
      wrote on last edited by
      #5

      The pipe returned from _popen is a FILE* so you must read the date from it.

      1 Reply Last reply
      0
      • K k5054

        using a C style FILE * you have to use C stdio functions. So for example you could do

        #include
        #include

        FILE *pipe = popen( ... );

        char *buff = NULL;
        size_t blen = 0;
        while( getline(&buff, &blen, pipe) > 0) {
        // process input data in buff;
        }
        free(buff);

        I generally prefer getline() to fgets() when using cstdio because it allocates and grows the input buffer as needed. If you wish to stick with a more C++ style interface, then maybe look into [Boost.Process](https://www.boost.org/doc/libs/1\_79\_0/doc/html/process.html) I think you've mentioned QT as part of your framework, so there's [QProcess](https://doc.qt.io/qt-6/qprocess.html) as well.

        Keep Calm and Carry On

        _ Offline
        _ Offline
        _Flaviu
        wrote on last edited by
        #6

        The C++ app is MFC app ...

        K 1 Reply Last reply
        0
        • _ _Flaviu

          The C++ app is MFC app ...

          K Offline
          K Offline
          k5054
          wrote on last edited by
          #7

          For some reason, I was assuming you were using linux. If you're on windows, there's no getline in the C stdio library, so you'll have to use fgets() or another C stdio FILE i/o function. It might be a better choice to use the libcurl API directly. Or another C/C++ client library. A quick google search turned up [Windows HTTP Services - Win32 apps | Microsoft Docs](https://docs.microsoft.com/en-us/windows/win32/winhttp/winhttp-start-page) , but that appears to be a Win32 API, so may not be applicable to your situation. There's also [GitHub - embeddedmz/httpclient-cpp: C++ client for making simple HTTP requests](https://github.com/embeddedmz/httpclient-cpp) which might work for you too. I have not tried this package, so cannot speak to its quality or suitability for any purpose, what so ever. Caveat usor.

          Keep Calm and Carry On

          _ 1 Reply Last reply
          0
          • K k5054

            For some reason, I was assuming you were using linux. If you're on windows, there's no getline in the C stdio library, so you'll have to use fgets() or another C stdio FILE i/o function. It might be a better choice to use the libcurl API directly. Or another C/C++ client library. A quick google search turned up [Windows HTTP Services - Win32 apps | Microsoft Docs](https://docs.microsoft.com/en-us/windows/win32/winhttp/winhttp-start-page) , but that appears to be a Win32 API, so may not be applicable to your situation. There's also [GitHub - embeddedmz/httpclient-cpp: C++ client for making simple HTTP requests](https://github.com/embeddedmz/httpclient-cpp) which might work for you too. I have not tried this package, so cannot speak to its quality or suitability for any purpose, what so ever. Caveat usor.

            Keep Calm and Carry On

            _ Offline
            _ Offline
            _Flaviu
            wrote on last edited by
            #8

            But there is getline in c++: std::getline - cppreference.com[^] I need to try it, then I'll ocme back wih feedback.

            K 1 Reply Last reply
            0
            • _ _Flaviu

              But there is getline in c++: std::getline - cppreference.com[^] I need to try it, then I'll ocme back wih feedback.

              K Offline
              K Offline
              k5054
              wrote on last edited by
              #9

              std::getline() isn't part of C stdio, its part of C++. The getline with the signature int getline(char **, size_t *, FILE *) (i.e C stdio, thus the FILE * parameter) is not provided by MS in the windows C/C++ environment. Or at least it wasn't with VS 2017. It might have been added since then, but I don't think so.

              Keep Calm and Carry On

              _ 1 Reply Last reply
              0
              • K k5054

                std::getline() isn't part of C stdio, its part of C++. The getline with the signature int getline(char **, size_t *, FILE *) (i.e C stdio, thus the FILE * parameter) is not provided by MS in the windows C/C++ environment. Or at least it wasn't with VS 2017. It might have been added since then, but I don't think so.

                Keep Calm and Carry On

                _ Offline
                _ Offline
                _Flaviu
                wrote on last edited by
                #10

                I have tried:

                std::ifstream ifs("curl --header \"x-api-key:ABCD\" -s https://api.test.se/api/mydata");
                while (ifs.good())
                {
                std::string line;
                while (std::getline(ifs, line))
                {
                std::cout << line.c_str() << std::endl;
                }
                }

                Nothing retrieved.

                L K 2 Replies Last reply
                0
                • _ _Flaviu

                  I have tried:

                  std::ifstream ifs("curl --header \"x-api-key:ABCD\" -s https://api.test.se/api/mydata");
                  while (ifs.good())
                  {
                  std::string line;
                  while (std::getline(ifs, line))
                  {
                  std::cout << line.c_str() << std::endl;
                  }
                  }

                  Nothing retrieved.

                  L Offline
                  L Offline
                  Lost User
                  wrote on last edited by
                  #11

                  std::ifstream reads files, and does not have a constructor which executes an external program. You should go back to pure C and use the _popen function. [edit] This all you need:

                  char buffer\[132\];
                  FILE\* pipette = \_popen("curl --header \\"x-api-key:ABCD\\" -s https://api.test.se/api/mydata", "r");
                  while (fgets(buffer, 132, pipette))
                  {
                      printf("%s", buffer);
                  }
                  

                  [/edit]

                  _ 1 Reply Last reply
                  0
                  • _ _Flaviu

                    I have tried:

                    std::ifstream ifs("curl --header \"x-api-key:ABCD\" -s https://api.test.se/api/mydata");
                    while (ifs.good())
                    {
                    std::string line;
                    while (std::getline(ifs, line))
                    {
                    std::cout << line.c_str() << std::endl;
                    }
                    }

                    Nothing retrieved.

                    K Offline
                    K Offline
                    k5054
                    wrote on last edited by
                    #12

                    Of course not, unless you actually have a file in your current directory called curl --header "x-api-key:ABCD" -s https://api.test.se/api/mydata.

                    Keep Calm and Carry On

                    1 Reply Last reply
                    0
                    • L Lost User

                      std::ifstream reads files, and does not have a constructor which executes an external program. You should go back to pure C and use the _popen function. [edit] This all you need:

                      char buffer\[132\];
                      FILE\* pipette = \_popen("curl --header \\"x-api-key:ABCD\\" -s https://api.test.se/api/mydata", "r");
                      while (fgets(buffer, 132, pipette))
                      {
                          printf("%s", buffer);
                      }
                      

                      [/edit]

                      _ Offline
                      _ Offline
                      _Flaviu
                      wrote on last edited by
                      #13

                      Yes, that seems to work. Thank you all of you !

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups