C语言定义从URL中获取键值的接口

时间:2021-11-15 08:52:35

环境:centos7下,对客户端http请求进行解析,来获取有效键值(包括汉字)。

应用:有了它,服务器后台程序就可以获取前端请求的数据信息。

头文件

 /* 这是一份关于从Http请求信息中提取键值的接口声明文件 */
#ifndef _URIDecode_H_
#define _URIDecode_H_
#include "status.h"
/*
* 相关数据类型
*/
typedef unsigned char uChar; /*
* 获取指定键的键值
*
* queryStr -- 请求信息的字符串
* keyName -- 指定的键名
* resultp -- (用指针)返回键值
* 返回值,如果操作成功返回OK;否则返回ERROR。 注意的是,键名不存在的话,键值返回NULL。
*/
STATUS
GetTheKeyValue(char const *queryStr, char const *keyName, uChar **resultp);
#endif

URIDecode.h

接口定义

 /* 这是一份描述从Http请求信息中提取有效键值的接口定义文件 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "URIDecode.h"
#include "status.h" /*
* 内部接口
*
*
* 统计键值包含的字节数目。
*
* keyValue -- 指定的键值
* 返回值,返回统计的结果。
*/
static int
GetItsSize(char const *keyValue)
{
char const *p = NULL;
char ch;
int counter = ; if(keyValue == NULL) //检查参数是否有效
{
fprintf(stdout, "传递给函数GetItsSize的参数keyValue无效。\n");
return -;
} for(p = keyValue; (ch = *p) != '\0'; p ++) //统计键值的长度
{
if(ch == '&') //表示键值结束
{
break;
}
if(ch == '%')
{
p += ;
}
counter ++;
}
return counter;
} /*
* 把两位16进制转换为10进制,并返回结果。
*
* digit1 -- 第一位16进制
* digit2 -- 第二位16进制
* 返回值,返回结果(返回类型是无符号整型)。
*/
static uChar
MergeThem(char digit1, char digit2)
{
uChar result;
int v1,v2; v1 = (digit1 <= 'Z' && digit1 >= 'A')? digit1 - 'A' + : digit1 - '';
v2 = (digit2 <= 'Z' && digit2 >= 'A')? digit2 - 'A' + : digit2 - '';
result = v1 * + v2;
return result;
} /*
* 外部接口
*
*
* 获取指定键的键值。
*
* queryStr -- 请求信息的字符串
* keyName -- 指定的键名
* resultp -- (用指针)返回键值
* 返回值,如果操作成功返回OK;否则返回ERROR。
*/
STATUS
GetTheKeyValue(char const *queryStr, char const *keyName, uChar **resultp)
{
uChar *result = NULL; //存放键值
char const *p = NULL;
char ch;
int keyValueSize;
int i = ; if(queryStr == NULL) //检查参数是否有效
{
fprintf(stdout, "传递给函数GetTheKeyValue的参数queryStr无效。\n");
return ERROR;
}
if(keyName == NULL)
{
fprintf(stdout, "传递给函数GetTheKeyValue的参数keyName无效。\n");
return ERROR;
}
if(resultp == NULL)
{
fprintf(stdout, "传递给函数GetTheKeyValue的参数resultp无效。\n");
return ERROR;
} p = strstr(queryStr, keyName); //找到键值起始位置
if(p == NULL) //如果指定的键名不存在
{
*resultp = result; //键值返回NULL
return OK;
} p = strchr(p, '=');
keyValueSize = GetItsSize(++ p); result = (uChar *)malloc((keyValueSize + ) * sizeof(uChar)); //申请一段内存来存放键值
if(result == NULL)
{
fprintf(stdout, "内存不足。\n");
exit(EXIT_FAILURE);
} while((ch = *p) != '\0' && ch != '&') //获取有效键值
{ if(ch == '%')
{
result [i] = MergeThem(p[], p[]);
p += ;
}
else
{
result [i] = (uChar)ch;
p ++;
}
i ++;
}
result [i] = '\0'; //结尾 *resultp = result;
return OK;
}