@@ -34,14 +34,17 @@ API::Request::Request(const char endpoint[])
3434
3535API::Request& API::Request::addParam (const char param[], String value)
3636{
37- params.concat (' &' );
37+ if (!params.isEmpty ())
38+ params.concat (' &' );
39+
3840 params.concat (param);
3941 params.concat (' =' );
4042 params.concat (urlEncode (value));
4143 return *this ;
4244}
4345
44- std::optional<JsonDocument> API::sendAuthorizedRequest (const API::Request& req)
46+ std::optional<JsonDocument> API::sendAuthorizedRequest (
47+ const API::Request& req, String ctype)
4548{
4649 WiFiClientSecure client;
4750 client.setCACert (rootCertificate ());
@@ -53,10 +56,10 @@ std::optional<JsonDocument> API::sendAuthorizedRequest(const API::Request& req)
5356
5457 HTTPClient https;
5558 if (https.begin (client, req.url )) {
56- https.addHeader (" Content-Type" , " application/x-www-form-urlencoded " );
59+ https.addHeader (" Content-Type" , ctype );
5760 https.addHeader (" Authorization" , String (" Token " ) + token);
5861 https.addHeader (" X-Tracket-Device" , id);
59- return sendHttpPOST (https, req.params . substring ( 1 ) );
62+ return sendHttpPOST (https, req.params );
6063#ifdef API_VERBOSE
6164 } else {
6265 SERIAL.println (" [api] Failed to https.begin()" );
@@ -80,7 +83,7 @@ std::optional<JsonDocument> API::sendNonauthorizedRequest(const API::Request& re
8083 if (https.begin (client, req.url )) {
8184 https.addHeader (" Content-Type" , " application/x-www-form-urlencoded" );
8285 https.addHeader (" X-Tracket-Device" , id);
83- return sendHttpPOST (https, req.params . substring ( 1 ) );
86+ return sendHttpPOST (https, req.params );
8487#ifdef API_VERBOSE
8588 } else {
8689 SERIAL.println (" [api] Failed to https.begin()" );
@@ -165,6 +168,34 @@ std::optional<JsonDocument> API::responseToJson(const String& response)
165168API::API (UUID id_, String token_):
166169 id (id_), token (token_) {}
167170
171+ bool API::sendMeasurements (const std::list<DataPacket>& pkts)
172+ {
173+ String send;
174+ JsonDocument doc;
175+ auto data = doc[" data" ].to <JsonArray>();
176+
177+ for (const auto & packet : pkts) {
178+ auto entry = data.add <JsonObject>();
179+ entry[" timestamp" ] = String (packet.timestamp );
180+ entry[" min" ] = std::lround (packet.minimum );
181+ entry[" max" ] = std::lround (packet.maximum );
182+ entry[" mean" ] = std::lround (packet.average );
183+ }
184+
185+ const auto size = serializeJson (data, send);
186+
187+ if (size == 0 ) {
188+ SERIAL.println (" sendMeasurements: serializeJson: failed!" );
189+ return false ;
190+ } else {
191+ auto request = Request (" measurements" );
192+ request.params = send;
193+
194+ const auto resp = sendAuthorizedRequest (request, " application/json" );
195+ return resp && (*resp)[" result" ] == " ok" ;
196+ }
197+ }
198+
168199bool API::sendMeasurement (const DataPacket& packet)
169200{
170201 const auto request = Request (" measurement" )
@@ -210,7 +241,7 @@ std::optional<API::LatestSoftware> API::getLatestSoftware()
210241 WiFiClientSecure client;
211242 client.setCACert (rootCertificate ());
212243
213- String endpoint = request.url + ' ?' + request.params . substring ( 1 ) ;
244+ String endpoint = request.url + ' ?' + request.params ;
214245
215246#ifdef API_VERBOSE
216247 SERIAL.print (" [api] Non-authorized request: " );
0 commit comments