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


    环境: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
    URIDecode.h

    接口定义

      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 }
  • 相关阅读:
    bzoj1221
    hdu3377
    bzoj3930
    bzoj3976
    bzoj4237
    fzu1977
    hdu1693
    ural1519
    bzoj1264
    回答自己的提问
  • 原文地址:https://www.cnblogs.com/the-one/p/7620495.html
Copyright © 2020-2023  润新知