C语言编写的简单HTTP json RPC

0 概述

0.0 参考

GitHub - hmng/jsonrpc-c: JSON-RPC in C (server only for now)

GitHub - cesanta/mongoose: Embedded Web Server

GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C

0.1 HTTP 服务

HTTP-JRPC-C 内置了HTTP服务用于提供JRPC API服务和静态文件服务。纯C语言编写。在最开始我是使用的hmng/jsonrpc-c 但是由于该服务只能提供TCP连接,不太适用于我的应用场景,因此结合mongoos库对其进行了重构。

0.2 JSON RPC HTTP错误码

错误码 sys-error描述
000正常
101未找到指定的方法
102格式错误
103请求方法错误

0.3 目录结构

一级二级三级四级文件说明
build编译输出目录
bin编译输出目录,也是运行目录
lib
webJRPC-HTTP会默认穷举该目录下的文件作为服务器静态文件
index.html静态服务器默认界面,可在运行JRPC-HTTP后尝试访问http://xxx.xxx.xxx.xxx:8000
JRPC-HTTP编译后得到的可执行文件,在Ubuntu 16下使用GCC编译。
CommLib
inc
cJSON.hcJSON.h头文件
comm.h常用函数,如delay_ms延时函数
src
cJSON.ccJSON.h源文件
comm.c常用函数,如delay_ms延时函数
JRPC
inc
jsonrpc-c.hjsonrpc头文件
mongoose.hmongoose头文件
src
jsonrpc-c.cjsonrpc源文件
mongoose.cmongoose源文件

1 使用

1.1 接口访问示例

方法原型 main.c:30

cJSON * add(jrpc_context * ctx, cJSON * params, cJSON *id) {
	cJSON * a = cJSON_GetArrayItem(params,0);
	cJSON * b = cJSON_GetArrayItem(params,1);
	return cJSON_CreateNumber(a->valueint + b->valueint);
}

POST方法,路径:http://xxx.xxx.xxx.xxx:8000

使用POSTMAN测试如下:

在这里插入图片描述

1.2 方法注册

在main()中创建了一个HTTP线程,线程的一开始会对JRPC进行初始化。在初始化完成后可以在任何时候调用jrpc_register_procedure()注册方法。

//线程句柄
pthread_t HTTP_main_thread_tid;

//RPC 方法
cJSON * say_hello(jrpc_context * ctx, cJSON * params, cJSON *id) {
	return cJSON_CreateString("Hello!");
}


cJSON * add(jrpc_context * ctx, cJSON * params, cJSON *id) {
	cJSON * a = cJSON_GetArrayItem(params,0);
	cJSON * b = cJSON_GetArrayItem(params,1);
	return cJSON_CreateNumber(a->valueint + b->valueint);
}

extern struct jrpc_server my_server;
void main(int argc, char *argv[])
{
    int ret;
    //获取运行路径
    ProgramRootPath = malloc(strlen(argv[0]));
    memset(ProgramRootPath,0x00,strlen(argv[0]));
    memcpy(ProgramRootPath,argv[0],strlen(argv[0])-17);    
    printf("PATH : %s",ProgramRootPath);
   
    //创建HTTP线程
    ret = pthread_create(&HTTP_main_thread_tid,NULL,HTTP_MainThread,NULL);
    jrpc_register_procedure(&my_server, say_hello, "sayHello", NULL );
	jrpc_register_procedure(&my_server, add, "add", NULL );
    while (1)
    {
        delay_ms(2000);
    }
    
}

1.3 修改监听端口

程序默认监听的端口号为8000,可在/JRPC/src/jsonrpc-c.c中修改为你所需要的端口。

void *HTTP_MainThread(void *arg)
{
    struct mg_mgr mgr;

    mg_mgr_init(&mgr);
	printf("Server listen on port 8000\r\n");
    //监听地址与端口设置
    mg_http_listen(&mgr, "0.0.0.0:8000", fn, NULL);     // Create listening connection
    while (1)
    {
        mg_mgr_poll(&mgr, 100);                        // Block forever
    }     
}

4 源码获取

gitee获取源码

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单JSON解析器的思路。 JSON解析器的主要作用是将JSON格式的字符串解析成数据结构,例如数组、对象、字符串、数字等。在C语言中,可以通过使用结构体、指针和动态内存分配等技术来实现。 以下是一个简单JSON解析器的设计思路: 首先,您需要定义一个能够表示JSON数据的数据结构。这个数据结构可以使用结构体来实现,包含以下类型: - 对象:使用链表或二叉树来表示,其中每个节点包含一个键值对,键为字符串类型,值可以是任何JSON数据类型; - 数组:使用链表来表示,其中每个节点包含一个元素,可以是任何JSON数据类型; - 字符串:使用字符数组或指针来表示,需要考虑转义字符的处理; - 数字:使用数值类型来表示,包括整数和浮点数; - 布尔值:使用布尔类型表示; - 空值:使用空类型表示。 然后,您需要实现一个语法分析器,将输入的JSON字符串分解为语法单元,例如左括号、右括号、逗号、冒号、字符串、数字等。这些语法单元可以使用枚举类型或结构体来表示。 接下来,您需要实现一个解析器,根据语法单元将其转换为相应的JSON数据类型,并使用动态内存分配来创建数据结构。在解析过程中,需要考虑语法单元的顺序和嵌套关系,以及各种语法规则和限制。同时,需要考虑字符串中的转义字符的处理,例如反斜杠、双引号等。 最后,您可以将解析后的JSON数据存储在先前定义的数据结构中,并进行相应的操作和处理。需要注意的是,解析器的输出应符合JSON规范,且需要进行大量的测试以确保解析器的正确性和稳定性。 需要注意的是,JSON解析器是一个复杂的任务。在实现时,您需要考虑各种边界条件和异常情况,例如不完整的JSON字符串、嵌套层数过多等。同时,您还需要进行大量的测试以确保解析器的正确性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值