Creating a RESTful API in C is a bit unconventional compared to modern languages like Python or JavaScript, but it’s a great way to dive deep into the mechanics of web servers and APIs. This post will guide you through implementing a simple airline API in GNU C on an Arch Linux host and show you how to query this API using C#.
Prerequisites
Before we begin, ensure you have the following installed on your Arch Linux system:
- GCC (GNU Compiler Collection)
libmicrohttpd(for handling HTTP requests)json-c(for JSON handling)- Mono (for running C# code on Linux)
You can install these via pacman:
sudo pacman -S gcc libmicrohttpd json-c monoStep 1: Setting Up the Airline API in C
We’ll use libmicrohttpd for handling HTTP requests and json-c for JSON parsing and generation.
1.1. Install Required Libraries
Ensure libmicrohttpd and json-c are installed:
sudo pacman -S libmicrohttpd json-c1.2. Create the Airline API
Create a new directory for your project and navigate into it:
mkdir airline_api
cd airline_apiCreate a file named airline_api.c:
#include <microhttpd.h>
#include <json-c/json.h>
#include <stdio.h>
#include <string.h>
#define PORT 8888
struct Airline {
int id;
const char *name;
const char *destination;
};
struct Airline airlines[] = {
{1, "Airline A", "New York"},
{2, "Airline B", "Los Angeles"},
{3, "Airline C", "Chicago"}
};
static int send_response(struct MHD_Connection *connection, const char *json) {
struct MHD_Response *response;
int ret;
response = MHD_create_response_from_buffer(strlen(json), (void *) json, MHD_RESPMEM_PERSISTENT);
if (!response) return MHD_NO;
MHD_add_response_header(response, MHD_HTTP_HEADER_CONTENT_TYPE, "application/json");
ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
MHD_destroy_response(response);
return ret;
}
static int request_handler(void *cls, struct MHD_Connection *connection, const char *url,
const char *method, const char *version, const char *upload_data,
size_t *upload_data_size, void **con_cls) {
struct json_object *json = json_object_new_array();
for (int i = 0; i < sizeof(airlines) / sizeof(airlines[0]); i++) {
struct json_object *airline_obj = json_object_new_object();
json_object_object_add(airline_obj, "id", json_object_new_int(airlines[i].id));
json_object_object_add(airline_obj, "name", json_object_new_string(airlines[i].name));
json_object_object_add(airline_obj, "destination", json_object_new_string(airlines[i].destination));
json_object_array_add(json, airline_obj);
}
const char *json_str = json_object_to_json_string(json);
int ret = send_response(connection, json_str);
json_object_put(json);
return ret;
}
int main() {
struct MHD_Daemon *daemon;
daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, PORT, NULL, NULL, &request_handler, NULL, MHD_OPTION_END);
if (!daemon) return 1;
printf("Server is running on port %d\n", PORT);
getchar(); // Wait for user input to stop the server
MHD_stop_daemon(daemon);
return 0;
}1.3. Compile the Airline API
Compile the C program:
gcc -o airline_api airline_api.c -lmicrohttpd -ljson-c1.4. Run the Airline API
Run the compiled program:
./airline_apiYour API should now be running on http://localhost:8888.
Step 2: Querying the API with C
Next, let’s create a C# program to query our airline API.
2.1. Create a New C# Project
Create a new directory for your C# project and navigate into it:
mkdir airline_client
cd airline_clientCreate a file named Program.cs:
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
class Program
{
static async Task Main(string[] args)
{
string url = "http://localhost:8888";
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
JArray airlines = JArray.Parse(responseBody);
foreach (var airline in airlines)
{
Console.WriteLine($"ID: {airline["id"]}, Name: {airline["name"]}, Destination: {airline["destination"]}");
}
}
}
}2.2. Install Required Libraries
Install the Newtonsoft.Json package for JSON handling:
dotnet new console -n AirlineClient
cd AirlineClient
dotnet add package Newtonsoft.Json2.3. Compile and Run the C# Program
Compile the C# program:
dotnet buildRun the compiled program:
dotnet runSummary
In this tutorial, we created a simple RESTful API using GNU C and libmicrohttpd on Arch Linux. We defined an endpoint that returns a list of airlines in JSON format. We then created a C# client application that queries this API and displays the airline information.
This exercise not only demonstrates the power and flexibility of C for creating web servers but also showcases the interoperability between different programming environments. By leveraging libraries like libmicrohttpd and json-c in C, and using modern C# features and libraries, we can build robust and efficient applications across platforms.
Views: 41
