Put JSON to API Endpoint using WifiNina Library

I have an Uno Wifi v2 board and I'm using WiFiNINA to connect to an API on the Internet. I can perform GET requests to the API without any issues but when I attempt to perform PUT requests I get errors.

connected to server
HTTP/1.1 400 Bad Request
Server: awselb/2.0
Date: Sat, 29 Jul 2023 01:17:50 GMT
Content-Type: text/html
Content-Length: 122
Connection: close

Here is all of the code:

/*

This example puts data to a secure API endpoint

*/

#include <SPI.h>
#include <WiFiNINA.h>

#include "arduino_secrets.h"
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0;            // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;
char server[] = SERVER;

WiFiSSLClient client;

void setup() {

  Serial.begin(9600);

  while (!Serial) {

    ; // wait for serial port to connect. Needed for native USB port only

  }

  // check for the WiFi module:

  if (WiFi.status() == WL_NO_MODULE) {

    Serial.println("Communication with WiFi module failed!");

    // don't continue

    while (true);

  }

  String fv = WiFi.firmwareVersion();

  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {

    Serial.println("Please upgrade the firmware");

  }

  // attempt to connect to WiFi network:

  while (status != WL_CONNECTED) {

    Serial.print("Attempting to connect to SSID: ");

    Serial.println(ssid);

    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:

    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:

    delay(10000);

  }

  Serial.println("Connected to wifi");

  printWiFiStatus();

  Serial.println("\nStarting connection to server...");

  if (client.connect(server, 443)) {

    Serial.println("connected to server");

    client.println("Content-Type: application/json");

    client.println("User-Agent: ArduinoWiFi/1.1");

    client.println("PUT / HTTP/1.1");

    client.println('{"id":"78918", "name":"Pizza", "price":"12.45"}');

    client.println("Connection: close");

    client.println();

  }
}

void loop() {

  // if there are incoming bytes available

  // from the server, read them and print them:

  while (client.available()) {

    char c = client.read();

    Serial.write(c);

  }

  // if the server's disconnected, stop the client:

  if (!client.connected()) {

    Serial.println();

    Serial.println("disconnecting from server.");

    client.stop();

    // do nothing forevermore:

    while (true);

  }
}

void printWiFiStatus() {

  // print the SSID of the network you're attached to:

  Serial.print("SSID: ");

  Serial.println(WiFi.SSID());

  // print your board's IP address:

  IPAddress ip = WiFi.localIP();

  Serial.print("IP Address: ");

  Serial.println(ip);

  // print the received signal strength:

  long rssi = WiFi.RSSI();

  Serial.print("signal strength (RSSI):");

  Serial.print(rssi);

  Serial.println(" dBm");
}

I need Content-Type to change to application/json and I need the payload sent with the request. How can I do this with the WifiNina library?

How about you post all of your code here. How to get the best out of this forum - Using Arduino / Installation & Troubleshooting - Arduino Forum

I've updated it to include all of my code. Thanks!

curl work with the API like so:

curl -d '{"id":"2", "name":"Test", "price":"2.45"}' -H "Content-Type: application/json" -X POST $API_URL

This solution: How to POST JSON data from NANO 33 IOT? - #9 by Klaus_K worked for me. It uses the HTTP library instead of WifiNina to send the data.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.