Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    A Curl like POST using NetworkHttpHandlerRef?

    General Talk
    r21 c++
    2
    8
    1.2k
    Loading More Posts
    • 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.
    • kbarK
      kbar
      last edited by kbar

      Is it possible to do a Curl style post using NetworkHttpHandlerRef?

      I see that it has HandlePost, but so far haven't been successful in getting it working.

      About to compile libCurl with OpenSSL support, but thought I would check here in case I don't need to.

      Thanks!
      Kent

      1 Reply Last reply Reply Quote 0
      • ManuelM
        Manuel
        last edited by Manuel

        hello,

        you want to send file or just string data ?

        did you had a look at this manual ?

        Cheers,
        Manuel

        MAXON SDK Specialist

        MAXON Registered Developer

        1 Reply Last reply Reply Quote 0
        • kbarK
          kbar
          last edited by kbar

          Hi Manuel,

          I want to send a HTTP post request with a couple of parameters, which will then return some JSON data.

          I can’t see how to do this from the link you sent. I could open a tcp connection myself to port 80 of my URL, construct and build my own HTTPS header, send it and listen for the returned data.

          The HandlePost function of the NetworkHttpHandlerRef class looks like it was written to do exactly this. But there is no documentation showing how to use it and no examples.

          https://developers.maxon.net/docs/cpp/2023_2/classmaxon_1_1_network_http_handler_interface.html

          I have filled in the DataDictionary with my parameters but when I call HandlePost it always seems to think there is an error in the MAXON result, but it contains no error message telling me what went wrong.

          I would like to call something like this

          curl https://api.myapi.com/v1 -d "product=myproduct" -X POST

          Kent

          1 Reply Last reply Reply Quote 0
          • kbarK
            kbar
            last edited by

            This post is deleted!
            1 Reply Last reply Reply Quote 0
            • ManuelM
              Manuel
              last edited by Manuel

              hello,

              This should work. memReq will have the returned json file in Ascii.
              After asking the techTeam.

              #include "maxon/network_url.h"  // for HTTP_POSTMETHOD and HTTP_POSTDATA
              #include "maxon/file_utilities.h"
              
                      iferr_scope;
              	maxon::Url theServer{"http://localhost:8080"_s};
              
              	maxon::String postData = "foo=bar&bin=go"_s;
              
              	theServer.Set(maxon::URLFLAGS::HTTP_POSTMETHOD, maxon::HTTPMETHOD::POST) iferr_return;
              	theServer.Set(maxon::URLFLAGS::HTTP_POSTDATA, maxon::CString(postData, maxon::StringEncodings::Utf8())) iferr_return;
              
              	maxon::BaseArray<maxon::Char> memReq;
              	iferr(maxon::FileUtilities::ReadFileToMemory(theServer, memReq))
              		DiagnosticOutput("@", err);
              
              	ApplicationOutput("answer @", memReq);
              	
              	maxon::String result(memReq);
              
              	ApplicationOutput("result @", result);
              	return maxon::OK;
              

              the simple web server i used this with :

              from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
              import SocketServer
              import json
              import cgi
              
              class Server(BaseHTTPRequestHandler):
                  def _set_headers(self):
                      self.send_response(200)
                      #self.send_header('Content-type', 'application/json')
                      self.send_header('Content-type', 'text/html')
                      self.end_headers()
                      
                  def do_HEAD(self):
                      self._set_headers()
                      
                  # GET sends back a Hello world message
                  def do_GET(self):
                      self._set_headers()
                      self.wfile.write(json.dumps({'hello': 'world', 'received': 'ok'}))
                      
                  # POST echoes the message adding a JSON field
                  def do_POST(self):
                      print 'do post'
                      ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
                      form = cgi.FieldStorage(
                          fp=self.rfile,
                          headers=self.headers,
                          environ={'REQUEST_METHOD': 'POST'}
                      )
              
                      print form.getvalue("foo")
                      print form.getvalue("bin")
                      
              
                      # refuse to receive non-json content
                      if ctype != 'application/x-www-form-urlencoded':
                          self.send_response(400)
                          self.end_headers()
                          print "Can't receive non application/x-www-form-urlencoded content", ctype
                          return
              
              
                     
                      
                      # send the message back
                      self._set_headers()
                      self.wfile.write(json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]))
                      
              def run(server_class=HTTPServer, handler_class=Server, port=8080):
                  server_address = ('', port)
                  httpd = server_class(server_address, handler_class)
                  
                  print 'Starting httpd on port %d...' % port
                  httpd.serve_forever()
                  
              if __name__ == "__main__":
                  run()
              

              Cheers,
              Manuel

              MAXON SDK Specialist

              MAXON Registered Developer

              1 Reply Last reply Reply Quote 0
              • kbarK
                kbar
                last edited by

                Hi Manuel,

                Thanks for the example. That is excellent. For now though I have moved onto using libcurl, but when I come back to this again I will be sure to use this example again. I hope this gets added to the documentation somwhere.

                Cheers,
                Kent

                1 Reply Last reply Reply Quote 0
                • ManuelM
                  Manuel
                  last edited by

                  hello,

                  don't worry, it will.

                  ps : I don't forget the OAuth example neither.

                  cheers,
                  Manuel

                  MAXON SDK Specialist

                  MAXON Registered Developer

                  1 Reply Last reply Reply Quote 0
                  • ManuelM
                    Manuel
                    last edited by

                    hello,

                    i'll be set this thread as resolved tomorrow if nothing to add.

                    Cheers
                    Manuel

                    MAXON SDK Specialist

                    MAXON Registered Developer

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post