архитектура для апи проекта на си
Пример архитектуры для 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 проекта на языке Си. Вы можете расширять и улучшать её в зависимости от требований вашего проекта.