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 ...
随机推荐
- Groovy读取文件信息
1. eachLine -- 打开和读取文件的每一行 new File("foo.txt").eachLine { println it.toUpperCase(); } 2. r ...
- Android事件传递机制详解及最新源码分析——ViewGroup篇
版权声明:本文出自汪磊的博客,转载请务必注明出处. 在上一篇<Android事件传递机制详解及最新源码分析--View篇>中,详细讲解了View事件的传递机制,没掌握或者掌握不扎实的小伙伴 ...
- 分布式定时任务 -- elastic-job
一.前言 在我们的项目当中,使用定时任务是避免不了的,我们在部署定时任务时,通常只部署一台机器.部署多台机器时,同一个任务会执行多次.比如短信提醒,每天定时的给用户下发短信,如果部署了多台,同一个用户 ...
- 【DDD】领域驱动设计实践 —— 限界上下文识别
本文从战略层面街上DDD中关于限界上下文的相关知识,并以ECO系统为例子,介绍如何识别上下文.限界上下文(Bounded Context)定义了每个模型的应用范围,在每个Bounded Context ...
- 团队作业4--第一次项目冲刺(Alpha版本) 5
一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 对前两天完成的功能进行整合 测试完成功能(测试算法是否有bug,界面设计是否人性化,适合用户使用.) 四.困难与问题 在对前两 ...
- 201521123113《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 1.2 可选:使用常规方法总结其他上课内容. 使用NetB ...
- 201521123099 《Java程序设计》第3周学习总结
1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...
- 201521123034《Java程序设计》第十一周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 多线程的冲突 互斥共享(有时两个或两个以上的线程需要同时对 而线程之间如果不加以控制,会产生一种情况-竞争) sy ...
- 框架应用:Spring framework (五) - Spring MVC技术
软件开发中的MVC设计模式 软件开发的目标是减小耦合,让模块之前关系清晰. MVC模式在软件开发中经常和ORM模式一起应用,主要作用是将(数据抽象,数据实体传输和前台数据展示)分层,这样前台,后台,数 ...
- 数据库系统概论——Chap. 1 Introduction
数据库系统概论--Introduction 一.数据库的4个基本概念 数据(data):数据是数据库中存储的基本单位.我们把描述事物的符号记录称为数据.数据和关于数据的解释是不可分的,数据的含义称为数 ...