HTTP POST from Arduino/ESP8266/ESP32 How to send parameters (x-www-form-urlencoded) using micropython!



  • I don't have ANY experience with micropython..but I would like to use blockly features of UI flow for development thus I would appreciate if anyone could help me out how to translate this simple http post with parameters into micropython?

      http.begin("https://api.46elks.com/a1/sms");
      http.addHeader("Content-Type", "application/x-www-form-urlencoded"); 
      http.setAuthorization("XXXXX", "YYYYYY");
      int httpCode = http.POST("'from:+XXXXX','to:+XXXXX','message:Hej'");
    

    Here is the rest of the code! Thank you!

    #include <M5StickC.h>
    #include <Arduino.h>
    #include <WiFi.h>
    #include <WiFiMulti.h>
    
    #include <HTTPClient.h>
    
    #define USE_SERIAL Serial
    
    WiFiMulti wifiMulti;
    
    void setup() {
    
    USE_SERIAL.begin(115200);
    
    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();
    
    for(uint8_t t = 4; t > 0; t--) {
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
        USE_SERIAL.flush();
        delay(1000);
    }
    
    wifiMulti.addAP("YYYY", "ZZZZZ");
    
    }
    
    void loop() {
       // wait for WiFi connection
    if((wifiMulti.run() == WL_CONNECTED)) {
    
        HTTPClient http;
    
        USE_SERIAL.print("[HTTP] begin...\n");
        // configure traged server and url
    
          http.begin("https://api.46elks.com/a1/sms");
          http.addHeader("Content-Type", "application/x-www-form-urlencoded"); 
          http.setAuthorization("XXXXX", "YYYYYY");
          int httpCode = http.POST("'from:+XXXXX','to:+XXXXX','message:Hej'");
    
        USE_SERIAL.print("[HTTP] GET...\n");
        // start connection and send HTTP header
         httpCode = http.GET();
    
        // httpCode will be negative on error
        if(httpCode > 0) {
            // HTTP header has been send and Server response header has been handled
            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);
    
            // file found at server
            if(httpCode == HTTP_CODE_OK) {
                String payload = http.getString();
                USE_SERIAL.println(payload);
            }
        } else {
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }
    
        http.end();
    }
    
    delay(10000);
    }


  • I've been trying something similar and it appears to be impossible with uiflow. Recently saw someone had success with raw micropython



  • My friend and colleague programmed this..

    https://github.com/46elks/46elks-getting-started/blob/master/code-examples/MicroPython/https_post_with_micropython.py
    If you would like to use 46elks Telco API mentioned in the code, register here and contact us at help@46elks.com for help.

    # Rudimentary HTTPS POST request using MicroPython without any 
     dependencies.
     # Supports Basic Auth and encodes data as x-www-form-urlencoded.
     #
     # Written by Johannes Ridderstedt <johannesl@46elks.com>
     # This code is public domain. Use freely.
    
     from ubinascii import b2a_base64
     import usocket
     import ussl
     
     # API credidentials
     username = 'u2c11ef65b429a8e16ccb1f960d02c734'
     password = 'C0ACCEEC0FAFE879189DD5D57F6EC348'
     
     def quote( value ):
       l = []
       for ch in value.encode( 'utf-8' ):
         if ch == b' ':
      l.append( b'+' )
    elif ch > 32 and ch < 128 and ch not in b'?=':
      l.append( b'%c' % ch )
    else:
      l.append( b'%%%02X' % ch )
       return b''.join( l )
    
     def api_post( path, data ):
    
       info = usocket.getaddrinfo( 'api.46elks.com', 443 )
       ip = info[0][-1]
    
       args = []
       for key in data:
    args.append( quote( key ) + '=' + quote( data[key] ) )
       content = b'&'.join( args )
    
       lines = [
    b'POST /a1/%s HTTP/1.0' % path,
    b'Authorization: Basic %s' % b2a_base64( username + ':' + password )[:-1],
    b'Content-type: application/x-www-form-urlencoded',
    b'Content-Length: %d' % len( content ),
    b'',
    content
       ]
    
       conn = usocket.socket()
       conn.connect( ip )
       conn = ussl.wrap_socket( conn )
       conn.write( b'\r\n'.join( lines ) )
       print( conn.read(4096).decode('utf-8') )
       conn.close()
    
     sms = {
       'to': '+46704508449',
       'from': 'MicroPython',
       'message': 'Hello from MicroPython!'
     }
     api_post( '/sms', sms )