🤖Have you ever tried Chat.M5Stack.com before asking??😎
    M5Stack Community
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

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

    M5 Stick/StickC
    2
    3
    7.1k
    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.
    • R
      rbrakus
      last edited by rbrakus

      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);
      }
      
      1 Reply Last reply Reply Quote 0
      • T
        Thrasher
        last edited by

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

        1 Reply Last reply Reply Quote 0
        • R
          rbrakus
          last edited by

          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 )
          
          1 Reply Last reply Reply Quote 0
          • First post
            Last post