implemented HTTP REST API interface over POST requests

This commit is contained in:
Bogdan Pilyugin 2023-06-10 16:52:59 +02:00
parent d007976274
commit d307a365a9
7 changed files with 78 additions and 10 deletions

View File

@ -30,6 +30,7 @@ idf_component_register(
"src/spifs.c" "src/spifs.c"
"src/HTTPServer.c" "src/HTTPServer.c"
"src/FileServer.c" "src/FileServer.c"
"src/HTTPAPISystem.c"
"src/HTTPPrintSystem.c" "src/HTTPPrintSystem.c"
"src/HTTPPostSystem.c" "src/HTTPPostSystem.c"
"src/Helpers.c" "src/Helpers.c"
@ -39,7 +40,7 @@ idf_component_register(
"src/SNTP.c" "src/SNTP.c"
"src/MQTT.c" "src/MQTT.c"
"src/MQTTSysHandler.c" "src/MQTTSysHandler.c"
"src/OTA.c" src/OTA.c
# "src/mDNS.c" # "src/mDNS.c"
INCLUDE_DIRS "." INCLUDE_DIRS "."

@ -1 +1 @@
Subproject commit a646e3ee0594ec2301e9b3fe6373ea274eb39e39 Subproject commit 03ff681a61cb03a43c6f008601a6e6090e9df2bd

View File

@ -56,7 +56,7 @@
#define SCRATCH_BUFSIZE 4096 #define SCRATCH_BUFSIZE 4096
#define AUTH_DATA_MAX_LENGTH 16 #define AUTH_DATA_MAX_LENGTH 16
#define HTTP_SERVER_DEBUG_LEVEL 0 #define HTTP_SERVER_DEBUG_LEVEL 1
typedef enum typedef enum
{ {
@ -64,7 +64,8 @@ typedef enum
HTTP_IO_NEED_DATA, // More data needed to continue, call again later HTTP_IO_NEED_DATA, // More data needed to continue, call again later
HTTP_IO_WAITING, // Waiting for asynchronous process to complete, call again later HTTP_IO_WAITING, // Waiting for asynchronous process to complete, call again later
HTTP_IO_REDIRECT, HTTP_IO_REDIRECT,
HTTP_IO_DONE_NOREFRESH HTTP_IO_DONE_NOREFRESH,
HTTP_IO_DONE_API
} HTTP_IO_RESULT; } HTTP_IO_RESULT;
@ -89,6 +90,7 @@ typedef struct
esp_err_t start_file_server(void); esp_err_t start_file_server(void);
HTTP_IO_RESULT HTTPPostApp(httpd_req_t *req, const char *filename, char *PostData); HTTP_IO_RESULT HTTPPostApp(httpd_req_t *req, const char *filename, char *PostData);
int HTTPPrint(httpd_req_t *req, char* buf, char* var); int HTTPPrint(httpd_req_t *req, char* buf, char* var);
HTTP_IO_RESULT HTTPPostSysAPI(httpd_req_t *req, char *PostData);
esp_err_t download_get_handler(httpd_req_t *req); esp_err_t download_get_handler(httpd_req_t *req);
esp_err_t upload_post_handler(httpd_req_t *req); esp_err_t upload_post_handler(httpd_req_t *req);

View File

@ -38,5 +38,4 @@ void regHTTPPrintCustom(int (*print_handler)(httpd_req_t *req, char *buf, char *
//User handler of variables 'var1=value1&var2=value2' styled in POST requests. //User handler of variables 'var1=value1&var2=value2' styled in POST requests.
void regAfterPostHandlerCustom(HTTP_IO_RESULT (*post_handler)(httpd_req_t *req, const char *filename, char *PostData)); void regAfterPostHandlerCustom(HTTP_IO_RESULT (*post_handler)(httpd_req_t *req, const char *filename, char *PostData));
#endif /* COMPONENTS_WEBGUIAPP_INCLUDE_USERCALLBACKS_H_ */ #endif /* COMPONENTS_WEBGUIAPP_INCLUDE_USERCALLBACKS_H_ */

56
src/HTTPAPISystem.c Normal file
View File

@ -0,0 +1,56 @@
/* Copyright 2023 Bogdan Pilyugin
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* File name: HTTPAPISystem.c
* Project: webguiapp_ref_implement
* Created on: 2023-06-10
* Author: bogdan
* Description:
*/
#include "HTTPServer.h"
#include "jWrite.h"
#include "jRead.h"
#define API_VER "1.00"
HTTP_IO_RESULT HTTPPostSysAPI(httpd_req_t *req, char *PostData)
{
char data[1024];
httpd_req_get_hdr_value_str(req, "Content-Type", (char*) data, 31);
if (!memcmp(data, "application/json", sizeof("application/json")))
{
char key[32] = {0};
struct jReadElement result;
jRead(PostData, "", &result);
if (result.dataType == JREAD_OBJECT)
{
jRead_string(PostData, "{'key'", key, sizeof(key), NULL);
}
//ESP_LOGI(TAG, "JSON data:%s", PostData);
jwOpen(data, sizeof(data), JW_OBJECT, JW_COMPACT);
jwObj_string("apiver", API_VER);
jwObj_string("key", key);;
jwObj_raw("result", "OK");
jwEnd();
jwClose();
httpd_resp_sendstr(req, data);
return HTTP_IO_DONE_API;
}
httpd_resp_set_status(req, HTTPD_400);
return HTTP_IO_DONE_API;
}

View File

@ -35,6 +35,7 @@ const char url_adapters[] = "adapters.html";
const char url_services[] = "services.html"; const char url_services[] = "services.html";
const char url_system[] = "system.html"; const char url_system[] = "system.html";
const char url_reboot[] = "reboot.html"; const char url_reboot[] = "reboot.html";
const char url_sysapi[] = "sysapi";
static HTTP_IO_RESULT AfterPostHandler(httpd_req_t *req, const char *filename, char *PostData); static HTTP_IO_RESULT AfterPostHandler(httpd_req_t *req, const char *filename, char *PostData);
static HTTP_IO_RESULT HTTPPostAdaptersSettings(httpd_req_t *req, char *PostData); static HTTP_IO_RESULT HTTPPostAdaptersSettings(httpd_req_t *req, char *PostData);
@ -49,6 +50,7 @@ void regAfterPostHandlerCustom(HTTP_IO_RESULT (*post_handler)(httpd_req_t *req,
AfterPostHandlerCust = post_handler; AfterPostHandlerCust = post_handler;
} }
HTTP_IO_RESULT HTTPPostApp(httpd_req_t *req, const char *filename, char *PostData) HTTP_IO_RESULT HTTPPostApp(httpd_req_t *req, const char *filename, char *PostData)
{ {
const char *pt = filename + 1; const char *pt = filename + 1;
@ -74,6 +76,8 @@ HTTP_IO_RESULT HTTPPostApp(httpd_req_t *req, const char *filename, char *PostDat
break; break;
case HTTP_IO_DONE_NOREFRESH: case HTTP_IO_DONE_NOREFRESH:
break; break;
case HTTP_IO_DONE_API:
break;
break; break;
} }
return res; return res;
@ -81,6 +85,8 @@ HTTP_IO_RESULT HTTPPostApp(httpd_req_t *req, const char *filename, char *PostDat
static HTTP_IO_RESULT AfterPostHandler(httpd_req_t *req, const char *filename, char *PostData) static HTTP_IO_RESULT AfterPostHandler(httpd_req_t *req, const char *filename, char *PostData)
{ {
if (!memcmp(filename, url_sysapi, sizeof(url_sysapi)))
return HTTPPostSysAPI(req, PostData);
if (!memcmp(filename, url_adapters, sizeof(url_adapters))) if (!memcmp(filename, url_adapters, sizeof(url_adapters)))
return HTTPPostAdaptersSettings(req, PostData); return HTTPPostAdaptersSettings(req, PostData);
if (!memcmp(filename, url_services, sizeof(url_services))) if (!memcmp(filename, url_services, sizeof(url_services)))
@ -91,6 +97,7 @@ static HTTP_IO_RESULT AfterPostHandler(httpd_req_t *req, const char *filename, c
if (!memcmp(filename, url_reboot, sizeof(url_reboot))) if (!memcmp(filename, url_reboot, sizeof(url_reboot)))
return HTTPPostReboot(req, PostData); return HTTPPostReboot(req, PostData);
// If not found target URL here, try to call custom code // If not found target URL here, try to call custom code
if (AfterPostHandlerCust != NULL) if (AfterPostHandlerCust != NULL)
return AfterPostHandlerCust(req, filename, PostData); return AfterPostHandlerCust(req, filename, PostData);
@ -98,6 +105,9 @@ static HTTP_IO_RESULT AfterPostHandler(httpd_req_t *req, const char *filename, c
return HTTP_IO_DONE; return HTTP_IO_DONE;
} }
static HTTP_IO_RESULT HTTPPostAdaptersSettings(httpd_req_t *req, char *PostData) static HTTP_IO_RESULT HTTPPostAdaptersSettings(httpd_req_t *req, char *PostData)
{ {
char tmp[33]; char tmp[33];

View File

@ -220,11 +220,6 @@ static esp_err_t POSTHandler(httpd_req_t *req)
req->uri, req->uri,
sizeof(filepath)); sizeof(filepath));
if (!memcmp(filename, "/api", 4))
{
return RestApiHandler(req);
}
http_res = HTTPPostApp(req, filename, buf); http_res = HTTPPostApp(req, filename, buf);
if (http_res == HTTP_IO_DONE) if (http_res == HTTP_IO_DONE)
@ -247,6 +242,11 @@ static esp_err_t POSTHandler(httpd_req_t *req)
httpd_resp_send(req, NULL, 0); // Response body can be empty httpd_resp_send(req, NULL, 0); // Response body can be empty
return ESP_OK; return ESP_OK;
} }
else if (http_res == HTTP_IO_DONE_API)
{
httpd_resp_send(req, NULL, 0); // Response body can be empty
return ESP_OK;
}
} }