C语言HTTP请求_url参数中有“=“,空格,“&“,中文等特殊符号时怎么办

  • 我的博客:https://blog.csdn.net/qq_37388044
  • 我的知乎:https://www.zhihu.com/people/bbtganmin
  • 联系方式:知乎私信

转载或者引用本文内容请注明来源及原作者!


目录

  • 前言
  • 一、什么是URL编码
  • 二、编码规则
  • 三、代码


前言

之前在做http时遇到一个问题,在url参数有空格,http服务器解析时出错,无法正常响应。

继 用C语言实现简单的HTTP数据请求。

  • 如果http请求时要加一个参数 id = bbt boy,那么请求报文第一行:
GET /bbt/nowtime?id=bbt boy HTTP/1.1
  • 这里就会出现一个问题,http协议是用空格来格开"GET"、url、“HTTP/1.1"的,如果url里也有空格,那服务器就没法找到"HTTP/1.1”,所以格式就乱套了。

这种情况我们需要通过URL编码来解决。


一、什么是URL编码

url编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符,将数据排行等等)作为URL的一部分或者分离地发给服务器。


二、编码规则

URL编码遵循下列规则: 每对name/value由&;符分开;每对来自表单的name/value由=符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =,&;,和 % 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。

假设我们在百度上搜索 “棒棒糖男孩 知乎”,可以看到url上显示:

https://www.baidu.com/baidu?word=%E6%A3%92%E6%A3%92%E7%B3%96%E7%94%B7%E5%AD%A9%20%E7%9F%A5%E4%B9%8E

显然,百度将 “棒棒糖男孩 知乎” 转成了 “%E6%A3%92%E6%A3%92%E7%B3%96%E7%94%B7%E5%AD%A9%20%E7%9F%A5%E4%B9%8E”

%E6%A3%92 %E6%A3%92 %E7%B3%96 %E7%94%B7 %E5%AD%A9 %20 %E7%9F%A5 %E4%B9%8E

其中中文以UTF-8编码,空格是ASCII码。

url在线编解码工具:http://tool.chinaz.com/tools/urlencode.aspx


三、代码

前言的例子中将参数 “bbt boy” 用URL编码,得到“bbt%20boy”
合成请求报文:

GET /bbt/nowtime?id=bbt%20boy HTTP/1.1

这样,问题就解决了。

下面是编码代码:

参考:https://www.cnblogs.com/quliuliu2013/p/9915288.html


int hex2dec(char c)
{
    if ('0' <= c && c <= '9')
    {
        return c - '0';
    }
    else if ('a' <= c && c <= 'f')
    {
        return c - 'a' + 10;
    }
    else if ('A' <= c && c <= 'F')
    {
        return c - 'A' + 10;
    }
    else
    {
        return -1;
    }
}
 
char dec2hex(short int c)
{
    if (0 <= c && c <= 9)
    {
        return c + '0';
    }
    else if (10 <= c && c <= 15)
    {
        return c + 'A' - 10;
    }
    else
    {
        return -1;
    }
}

//编码一个参数(out_url的大小需要 >= url大小 + 特殊字符 * 3 )
void bbt_urlencode(char *url, char *out_url)
{
    int i = 0;
    int len = strlen(url);
    int res_len = 0;
    for (i = 0; i < len; ++i)
    {
        char c = url[i];
        if (    ('0' <= c && c <= '9') ||
                ('a' <= c && c <= 'z') ||
                ('A' <= c && c <= 'Z') )
        {
            out_url[res_len++] = c;
        }
        else
        {
            int j = (short int)c;
            if (j < 0)
                j += 256;
            int i1, i0;
            i1 = j / 16;
            i0 = j - i1 * 16;
            out_url[res_len++] = '%';
            out_url[res_len++] = dec2hex(i1);
            out_url[res_len++] = dec2hex(i0);
        }
    }
    out_url[res_len] = '\0';
}

  

你可能感兴趣的:(http,url)