资讯详情

C++实现http发起GET/POST请求

目录

  • HTTP请求报文分析
  • HTTP响应报文分析
  • C 实现http发起GET请求
HTTP(Hyper Text Transfer Protocol,HTTP) 超文本传输协议是一个简单的请求响应协议。它指定了客户端可能发送给服务器的消息和响应。HTTP 是基于 TCP/IP 通信协议传递数据(HTML 默认工作的文件、图片文件、查询结果等。 TCP 协议 80 端口。

HTTP请求报文分析

http请求报文由请求行、请求头、请求体三部分组成。 在这里插入图片描述

①请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。然而,目前大多数浏览器只支持GET和POST,Spring 3.0提供了一个HiddenHttpMethodFilter,允许你通过允许你通过_method表单参数指定了这些特殊参数HTTP方法(实际上还是通过POST提交表格)。配置了服务端HiddenHttpMethodFilter后,Spring会根据_method相应的参数指定的值模拟HTTP这样,这些方法就可以使用了HTTP该方法映射了处理方法。 ②对应的请求URL地址,它和报文头Host属性构成完整的请求URL。 ③是协议名称和版本号。 ④是HTTP报文头,报文头包含多个属性,格式为属性名:属性值 ⑤它是一种报文体,它通过页面表单中的组件值param1=value1&m2=value键值将形式编码成格式串,它承载多个请求参数的数据。请求参数不仅可以通过报文体传递,还可以通过请求体URL也可以通过类似于//chapter15/user.html? param1=value1&m2=value请求参数以2的方式传递。

与上述请求报文相比,我们将进一步分解,您可以看到更详细的结构图:

常见的HTTP请求报文头属性 -请求报文通过一份Accept报告属性告诉服务器客户端接收什么样的响应;Accept属性值可以是一个或多个MIME类型的值,MIME格式:大类型/小类型[;参数] Accept:text/plain 比如: text/html,html文件 text/css,css文件 text/javascript,js文件 image/*,所有图片文件

--客户端的cookie通过此报文头属性传输到服务器端 Cookie: $Version=1; Skin=new;jsessionid=5F4771183629C9834F8382E23BE13C4C 服务端如何知道客户端的多个请求属于一个Session呢?注意后台jsessionid=5F4771183629C9834F8382E23BE13C4C木有?原来是通过HTTP请求报文头Cookie属性的jsessionid值是相关的!(当然也可以重写URL的方式将会话ID附带在每个URL后面哦)。

:这个请求从哪里来?URL假如你过来了google搜索一个商家的广告页面,你对这个广告页面感兴趣,鼠标一点一点地向商家的网站发送请求报告,请求报告Referer报文头属性值为http://www.google.com。

控制缓存,比如客户端需要缓存一年才能响应回复的请求,或者不想通过这个报文头达到目的。 以下设置相当于在客户端缓存相应请求返回的响应内容: Cache-Control: no-cache User-Agent:浏览器通知服务器,客户浏览器与操作系统相关

: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) uChrome/69.0.3497.100 Safari/537.36

:表示客户端与服务的连接类型;Keep-Alive表示连接持久,close已关闭 Connection: keep-alive

:请求体的长度

POST http://39.108.107.149:8080/vk/app/rest/ddp/iModelServiceImpl/findModelByType HTTP/1.1 User-Agent: Fiddler Host: 39.108.107.149:8080 Content-Length: 11 

:请求的服务器主机名称

:与实体对应的请求MIME信息。如果是post请求,会有这个头,默认值application/x-www-form-urlencoded,表示使用请求体内容url编码 Content-Type: application/x-www-form-urlencoded

:浏览器通知服务器,浏览器支持数据压缩格式。GZIP压缩 Accept-Encoding: gzip, deflate

:浏览器通知服务器,浏览器支持的语言。各国语言(国际化i18n) Accept-Language: zh-CN,zh;q=0.9

HTTP响应报文分析

HTTP响应报纸也由三部分组成( 响应行 响应头 响应体 ): ①报文协议及版本; ②状态代码和状态描述; ③响应报文头也由多个属性组成; ④回应报文风格,也就是我们真正想要的干货。

响应状态码–与请求报文相比,响应报文多了一个响应状态码,用清晰的语言告诉客户本请求的处理结果: 1xx 消息,一般是告诉客户,请求已经收到,正在处理中,不用担心… 2xx 成功处理一般意味着:请求收到,我理解你想要的,请求已经受理,已经处理和其他信息. 3xx 重定向到其他地方。它让客户发起另一个请求来完成整个处理。 4xx 处理错误,责任在客户端,如客户端要求不存在资源,客户端未经授权,禁止访问等。 5xx 处理错误,责任在服务端,如服务端抛出异常,路由出错,HTTP不支持版本等。

常见的HTTP响应报文头属性

C 实现http发起GET请求

获取城市天气信息,打印txt文件

#include <WinSock2.h> #include <iostream> #include <stdio.h> #include <string> DWORD g_dwErr;/// const int MAX_SIZE = 40960;//保存数组的大小
int MainWindow::dealHttp()
{ 
        
    /* 初始化 */
    WSADATA wsdata;
    WSAStartup(MAKEWORD(2, 2), &wsdata);

    const char* hostname = "www.weather.com.cn";
    struct hostent* host = gethostbyname(hostname);

    /* 初始化一个连接服务器的结构体 */
    sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(80);

    /* 此处也可以不用这么做,不需要用gethostbyname,把网址ping一下,得出IP也是可以的 */
    serveraddr.sin_addr.S_un.S_addr = *((int*)*host->h_addr_list);

    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1)
    { 
        
        cout << "socket error" << endl;
        return -1;
    }
    cout << "socket succeed" << endl;

    if (::connect(sock, (struct sockaddr*)&serveraddr, sizeof(sockaddr_in)) == -1)
    { 
        
        g_dwErr = GetLastError();
        cout << "connect error" << endl;
        closesocket(sock);
        return -1;
    }
    cout << "connect succeed" << endl;

    /* GET请求 */
    const char* bufSned = "GET http://www.weather.com.cn/data/sk/101190101.html\r\n";

    /* 发送GET请求 */
    if (send(sock, bufSned, strlen(bufSned), 0) > 0)
    { 
        
        cout << "send succeed" << endl;
    } else
    { 
        
        g_dwErr = GetLastError();
        cout << "send error, 错误编号: "<< g_dwErr << endl;
        closesocket(sock);
        return -1;
    }

    /* 文件,用于把HTML源码保存起来,没什么用处,只是为了自己看一下源码而已 */
    FILE *fp;
    fp = fopen("get.txt","w");

    char BufRecv[MAX_SIZE] = { 
        };
    int nLen = 0;
    string HtmlData;

    /* 开始接收数据 */
    while ((nLen = recv(sock, BufRecv, MAX_SIZE, 0)) > 0)
    { 
        
        /* 写文件 */
        fwrite(BufRecv, 1, nLen, fp);

        /* 把数组拼接成string类型,方便下面的处理 */
        HtmlData += BufRecv;
    }

    printf("BufRecv=%s\n",BufRecv);

    fclose(fp);
    closesocket(sock);
    return 0;
}

标签: 横沥板对板连接器bk13c06夷陵板对板连接器bk13c06

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司