архитектура для апи проекта на си

Пример архитектуры для API проекта на языке Си. Этот пример включает основные компоненты, такие как маршрутизация, обработка запросов и ответов, а также взаимодействие с базой данных. ### Структура проекта ``` my_api_project/ ├── include/ │ ├── config.h │ ├── router.h │ ├── handlers.h │ ├── database.h │ └── utils.h ├── src/ │ ├── main.c │ ├── config.c │ ├── router.c │ ├── handlers.c │ ├── database.c │ └── utils.c ├── Makefile └── README.md ``` ### include/config.h ```c #ifndef CONFIG_H #define CONFIG_H #define SERVER_PORT 8080 #define DB_HOST "localhost" #define DB_USER "user" #define DB_PASSWORD "password" #define DB_NAME "mydb" #endif // CONFIG_H ``` ### include/router.h ```c #ifndef ROUTER_H #define ROUTER_H void start_server(); void handle_request(int client_socket); #endif // ROUTER_H ``` ### include/handlers.h ```c #ifndef HANDLERS_H #define HANDLERS_H void handle_get_users(int client_socket); void handle_post_user(int client_socket); #endif // HANDLERS_H ``` ### include/database.h ```c #ifndef DATABASE_H #define DATABASE_H void connect_to_database(); void disconnect_from_database(); void query_database(const char *query); #endif // DATABASE_H ``` ### include/utils.h ```c #ifndef UTILS_H #define UTILS_H void send_response(int client_socket, const char *message); void log_message(const char *message); #endif // UTILS_H ``` ### src/main.c ```c #include "config.h" #include "router.h" int main() { start_server(); return 0; } ``` ### src/config.c ```c #include "config.h" ``` ### src/router.c ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include "router.h" #include "handlers.h" #include "utils.h" #include "config.h" void start_server() { int server_socket, client_socket; struct sockaddr_in server_addr, client_addr; socklen_t client_len = sizeof(client_addr); server_socket = socket(AF_INET, SOCK_STREAM, 0); if (server_socket == -1) { perror("Socket creation failed"); exit(EXIT_FAILURE); } memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(SERVER_PORT); if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("Bind failed"); close(server_socket); exit(EXIT_FAILURE); } if (listen(server_socket, 5) == -1) { perror("Listen failed"); close(server_socket); exit(EXIT_FAILURE); } log_message("Server started. Listening on port 8080..."); while (1) { client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_len); if (client_socket == -1) { perror("Accept failed"); continue; } handle_request(client_socket); close(client_socket); } close(server_socket); } void handle_request(int client_socket) { char buffer[1024]; int bytes_received = recv(client_socket, buffer, sizeof(buffer) - 1, 0); if (bytes_received == -1) { perror("Receive failed"); return; } buffer[bytes_received] = '\0'; log_message(buffer); if (strstr(buffer, "GET /users")) { handle_get_users(client_socket); } else if (strstr(buffer, "POST /user")) { handle_post_user(client_socket); } else { send_response(client_socket, "HTTP/1.1 404 Not Found\r\n\r\n"); } } ``` ### src/handlers.c ```c #include <stdio.h> #include <string.h> #include "handlers.h" #include "utils.h" #include "database.h" void handle_get_users(int client_socket) { connect_to_database(); query_database("SELECT * FROM users"); disconnect_from_database(); send_response(client_socket, "HTTP/1.1 200 OK\r\n\r\nUsers list"); } void handle_post_user(int client_socket) { connect_to_database(); query_database("INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com')"); disconnect_from_database(); send_response(client_socket, "HTTP/1.1 201 Created\r\n\r\nUser created"); } ``` ### src/database.c ```c #include <stdio.h> #include <mysql/mysql.h> #include "database.h" #include "config.h" MYSQL *conn; void connect_to_database() { conn = mysql_init(NULL); if (!mysql_real_connect(conn, DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, 0, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); mysql_close(conn); return; } } void disconnect_from_database() { mysql_close(conn); } void query_database(const char *query) { if (mysql_query(conn, query)) { fprintf(stderr, "%s\n", mysql_error(conn)); } } ``` ### src/utils.c ```c #include <stdio.h> #include <unistd.h> #include "utils.h" void send_response(int client_socket, const char *message) { write(client_socket, message, strlen(message)); } void log_message(const char *message) { printf("%s\n", message); } ``` ### Makefile ```makefile CC = gcc CFLAGS = -Iinclude -Wall LDFLAGS = -lmysqlclient SRCS = src/main.c src/config.c src/router.c src/handlers.c src/database.c src/utils.c OBJS = $(SRCS:.c=.o) EXEC = my_api_project all: $(EXEC) $(EXEC): $(OBJS) $(CC) $(OBJS) -o $(EXEC) $(LDFLAGS) %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(OBJS) $(EXEC) ``` ### README.md ```markdown # My API Project This is a simple API project written in C. ## Building and Running 1. Install MySQL development libraries. 2. Run `make` to build the project. 3. Run `./my_api_project` to start the server. ## Endpoints - `GET /users` - Get a list of users. - `POST /user` - Create a new user. ``` Это базовая архитектура для API проекта на языке Си. Вы можете расширять и улучшать её в зависимости от требований вашего проекта.