C语言定义从URL中获取键值的接口
环境: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;
}
C语言定义从URL中获取键值的接口的更多相关文章
- C#获取url中参数键值对的方法
方法如下: /// <summary> /// 遍历Url中的参数列表 /// </summary> /// <returns>如:(?userName=keley ...
- php中的常用数组函数(五)(数组中获取键名集合)
array_keys($arr, $search_value, $strict); --数组中获取键名的集合. //参数1 要检索的数组:参数2 要检索的键值 默认NULL: 参数3 是否严格比较(= ...
- js使用正则表达式从url中获取参数值
//从url中获取参数值 function getvl(name) { var reg = new RegExp("(^|\\?|&)"+ name +"=([^ ...
- js中以键值对的形式当枚举
js中以键值对的形式当枚举var Penum= { B: "姓名", C: "所属居委", D: "证件号", E: "性别&qu ...
- linux驱动之中断方式获取键值
linux驱动之中断方式获取键值 ----------------------------------------------------------------------------------- ...
- 在C#中用Linq从属性文件中读取键值对Key-Value Pair
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中用Linq从属性文件中读取键值对Key-Value Pair.
- PHP如何根据数组中的键值进行排序
主要是使用PHP的排序函数,asort()和arsort(). 为了减少代码的耦合性,我们将根据数组中的键值进行排序封装成一个函数 <?php $array = array( array(), ...
- Redis中的键值过期操作
1.过期设置 Redis 中设置过期时间主要通过以下四种方式: expire key seconds:设置 key 在 n 秒后过期: pexpire key milliseconds:设置 key ...
- js获取页面url中的各项值
一. 通过window.location获取各项参数 1.获取页面完整的url url = window.location.href; 2.获取页面的域名 host = window.location ...
随机推荐
- 拨开字符编码的迷雾--MySQL数据库字符编码
拨开字符编码迷雾系列文章链接: 拨开字符编码的迷雾--字符编码概述 拨开字符编码的迷雾--编译器如何处理文件编码 拨开字符编码的迷雾--字符编码转换 拨开字符编码的迷雾--MySQL数据库字符编码 1 ...
- PHP文件操作整理
三种目录表示: ./ 代表当前目录 ../ 代表父级目录 / 代表根目录 常用的文件操作函数有 通用读写: fpen() fwrite() fre ...
- Selenium启动关闭Webdriver
第一 启动chrome driver 1. 首先要通过System.setProperty指定chrome driver的路径,才能正常打开一个chrome浏览器: System.setPropert ...
- 几个常用EL表达式的用法
转载至 http://yqsshr.blog.51cto.com/469059/131824 1,用来获取表单数据 param 和 paramValues 1.jsp 的有如下表单 <for ...
- 解决 SQL 注入的另类方法
本文是翻译,版权归原作者所有 原文地址(original source):https://bitcoinrevolt.wordpress.com/2016/03/08/solving-the-prob ...
- 201521123113《Java程序设计》第8周学习总结
1. 本周学习总结 2. 书面作业 本次作业题集集合 Q1.List中指定元素的删除(题目4-1) 1.1 实验总结 remove函数中,开始我的写法是 for(int i=0;i<list.s ...
- 201521123086《java程序设计》第7周
本章学习总结 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 以下是ArrayList的contains源代码: public boolean con ...
- 201521123112《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点 1.2 可选:使用常规方法总结其他上课内容 课上讲了一些Markdown的用法,包括分割线.参考链接.代码引入等等. 2. 书面 ...
- 201521123036 《Java程序设计》第5周学习总结
本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 接口(interface):对行为的抽象 方法声明和常量值的集合 方法声明:接口中所有 ...
- 201521123036 《Java程序设计》第11周学习总结
本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用 ...