环境:centos7下,对客户端http请求进行解析,来获取有效键值(包括汉字)。
应用:有了它,服务器后台程序就可以获取前端请求的数据信息。
头文件

1 /* 这是一份关于从Http请求信息中提取键值的接口声明文件 */ 2 #ifndef _URIDecode_H_ 3 #define _URIDecode_H_ 4 #include "status.h" 5 /* 6 * 相关数据类型 7 */ 8 typedef unsigned char uChar; 9 10 /* 11 * 获取指定键的键值 12 * 13 * queryStr -- 请求信息的字符串 14 * keyName -- 指定的键名 15 * resultp -- (用指针)返回键值 16 * 返回值,如果操作成功返回OK;否则返回ERROR。 注意的是,键名不存在的话,键值返回NULL。 17 */ 18 STATUS 19 GetTheKeyValue(char const *queryStr, char const *keyName, uChar **resultp); 20 #endif
接口定义
1 /* 这是一份描述从Http请求信息中提取有效键值的接口定义文件 */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include "URIDecode.h" 6 #include "status.h" 7 8 /* 9 * 内部接口 10 * 11 * 12 * 统计键值包含的字节数目。 13 * 14 * keyValue -- 指定的键值 15 * 返回值,返回统计的结果。 16 */ 17 static int 18 GetItsSize(char const *keyValue) 19 { 20 char const *p = NULL; 21 char ch; 22 int counter = 0; 23 24 if(keyValue == NULL) //检查参数是否有效 25 { 26 fprintf(stdout, "传递给函数GetItsSize的参数keyValue无效。 "); 27 return -1; 28 } 29 30 for(p = keyValue; (ch = *p) != ''; p ++) //统计键值的长度 31 { 32 if(ch == '&') //表示键值结束 33 { 34 break; 35 } 36 if(ch == '%') 37 { 38 p += 2; 39 } 40 counter ++; 41 } 42 return counter; 43 } 44 45 /* 46 * 把两位16进制转换为10进制,并返回结果。 47 * 48 * digit1 -- 第一位16进制 49 * digit2 -- 第二位16进制 50 * 返回值,返回结果(返回类型是无符号整型)。 51 */ 52 static uChar 53 MergeThem(char digit1, char digit2) 54 { 55 uChar result; 56 int v1,v2; 57 58 v1 = (digit1 <= 'Z' && digit1 >= 'A')? digit1 - 'A' + 10 : digit1 - '0'; 59 v2 = (digit2 <= 'Z' && digit2 >= 'A')? digit2 - 'A' + 10 : digit2 - '0'; 60 result = v1 * 16 + v2; 61 return result; 62 } 63 64 65 /* 66 * 外部接口 67 * 68 * 69 * 获取指定键的键值。 70 * 71 * queryStr -- 请求信息的字符串 72 * keyName -- 指定的键名 73 * resultp -- (用指针)返回键值 74 * 返回值,如果操作成功返回OK;否则返回ERROR。 75 */ 76 STATUS 77 GetTheKeyValue(char const *queryStr, char const *keyName, uChar **resultp) 78 { 79 uChar *result = NULL; //存放键值 80 char const *p = NULL; 81 char ch; 82 int keyValueSize; 83 int i = 0; 84 85 if(queryStr == NULL) //检查参数是否有效 86 { 87 fprintf(stdout, "传递给函数GetTheKeyValue的参数queryStr无效。 "); 88 return ERROR; 89 } 90 if(keyName == NULL) 91 { 92 fprintf(stdout, "传递给函数GetTheKeyValue的参数keyName无效。 "); 93 return ERROR; 94 } 95 if(resultp == NULL) 96 { 97 fprintf(stdout, "传递给函数GetTheKeyValue的参数resultp无效。 "); 98 return ERROR; 99 } 100 101 p = strstr(queryStr, keyName); //找到键值起始位置 102 if(p == NULL) //如果指定的键名不存在 103 { 104 *resultp = result; //键值返回NULL 105 return OK; 106 } 107 108 p = strchr(p, '='); 109 keyValueSize = GetItsSize(++ p); 110 111 result = (uChar *)malloc((keyValueSize + 1) * sizeof(uChar)); //申请一段内存来存放键值 112 if(result == NULL) 113 { 114 fprintf(stdout, "内存不足。 "); 115 exit(EXIT_FAILURE); 116 } 117 118 while((ch = *p) != '' && ch != '&') //获取有效键值 119 { 120 121 if(ch == '%') 122 { 123 result [i] = MergeThem(p[1], p[2]); 124 p += 3; 125 } 126 else 127 { 128 result [i] = (uChar)ch; 129 p ++; 130 } 131 i ++; 132 } 133 result [i] = ''; //结尾 134 135 *resultp = result; 136 return OK; 137 }