HTTP请求的格式
HTTP请求没有body(参数)的格式:
具体的代码如下:
//拼接http字符串格式
char str1[4096];
memset(str1, 0, 4096);
strcat(str1, "POST /mobile/list.do HTTP/1.1\n"); //请求行: |请求方式|空格|你要访问的具体位置|空格|http版本|换行符号|
strcat(str1, "Host: 116.xx.xx.xxx:8080\n"); //请求头: |key头名字段|冒号|值|换行符号|
strcat(str1, "mobile: xxxxxxxxx\n");
strcat(str1, "password: xxxxx\n");
strcat(str1, "\n"); //请求头结束 |换行符号|
HTTP请求有body(参数)的格式:
具体的代码如下:
//拼接http字符串格式
char str1[4096];
memset(str1, 0, 4096);
strcat(str1, "POST /mobile/bind.do HTTP/1.1\n"); //请求行: |请求方式|空格|你要访问的具体位置|空格|http版本|换行符号|
strcat(str1, "Host: xxx.xx.xx.xx:8080\n"); //请求头: |key头名字段|冒号|值|换行符号|
strcat(str1, "mobile: xxxxxx\n");
strcat(str1, "password: xxx\n");
strcat(str1, "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\n");// body数据类型: |Content-Type|冒号|xxxxxxxx|分号|xxxxxx|换行符号|
strcat(str1, "Content-Length: 25\n"); // body递字符的个数: |Content-Length|冒号|个数|换行符号|
strcat(str1, "\n"); // header和body隔开:|换行符号|
strcat(str1, "binding-device=xxxxxxxxxx\n"); // body : |xxxxx|换行符号|
点击打开链接
怎么实现 HTTP请求格式,C++传参数,C,C++,VC++,window的HTTP请求通用
一,初始化socket已服务器链接
主要的俩个参数是服务器IP和端口,如果你要和你们公司的服务器链接,就要把dome第33行的端口号为你公司的端口号,把第34行的IP地址改为你们公司的IP地址,如果是正确的操着,命令窗口会打印“和服务器链接成功!”。
二,根据HTTP协议拼接字符串
请求行里的URL是你访问服务器的具体地址,也就是服务器的文件夹里的内容,有的是一个程序。HTTP协议可分为有没有参数两种情况,首先来看没有参数的HTTP协议,
没有参数的HTTP协议:
第一行:| 请求方式 | 空格 | 你要访问的具体位置URL | 空格 | http版本 | 换行符号 |
视列代码:
strcat(str1, "POST /mobile/bind.do HTTP/1.1\n");
第二行到请求头结束:| key头名字段 | 冒号|值 | 换行符号 |
视列代码:
strcat(str1, "password: xxxx\n");
最后一行:| 换行 |
视列代码:
strcat(str1, "\n");
完毕。
有参数的HTTP协议:
第一行:| 请求方式 |空格 | 你要访问的具体位置URL | 空格 | http版本 | 换行符号 |
视列代码:
strcat(str1, "POST /mobile/bind.do HTTP/1.1\n");
第二行到请求头结束:| key头名字段 | 冒号 | 值 | 换行符号 |
视列代码:
strcat(str1, "password: xxx\n");
请求头中重要的key和value是说明请求体的数据结构和字符个数:
视列代码:
strcat(str1, "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\n");
strcat(str1, "Content-Length: 25\n");
请求头结束标志:| 换行 |
视列代码:
strcat(str1, "\n");
请求体:| xxxx=xxxx | 换行 |
视列代码:
strcat(str1, "binding-device=DY09000105\n");
完毕。
三,发送HTTP请求
把上面拼接好的HTTP协议字符串,通过socket的send()函数发送给服务器,你和服务器只要链接成功发送一般都是成功的。
四,接收服务器返回的数据
用socket的recv()函数接收服务器返回的数据,这个函数返回接收的字符个数,这里接收的字符很多情况会是乱码,要把字符转译为可以显示的字符。
其实http的格式是很简单的,但是因为每个公司对业务逻辑的不同,就有很多的不同,但是大体的格式是不不变的,http的是在TCP协议上的通信,就是通过socket已服务器链接,然后向服务器发送特定的字符串,你也可以自定义自己的http请求的方法,为什么要用上图的格式呢,是因为服务器要解析你发来的字符串,它会判断第一个控制之前的字符串是请求的方法,空格之后是URL…..,所以你和服务器之间的默契是已经建立好了,也就是http协议,这是建立在你们都懂http协议的基础上的.你也可以建立自己的”http协议”,向我们公司就是自己定义的,它的第一个字符串是我们公司的设备的序列号…..,
好的,我们已经把http搞得差不多了,哪怎么发给服务器呢,对的我要和服务器链接起来在发送http请求,这里是要用socket和服务器链接,socket是非常广泛的,非常基础的网络通信协议,它是http的基础,怎么才能建立socket链接呢,只要两个产数,IP地址和端口,你把这两个参数个socket神奇的它就可以服务器链接了,链接成功就可以向服务器发送数据了,这之前你要和服务器制定好协议,比如你向服务器发送”1″,服务器就返回当天的天气,向服务器发送”2″,服务器就返回当天的商品是否打折…..哈哈,你可以自己定义也可以用http协议。
视列代码:
#pragma warning(disable:4996)//不要有4996错误
#pragma comment(lib,"ws2_32.lib")//lib动态链接库
#include<WinSock2.h>//socket2.2的版本
#include<stdio.h>
#include<stdlib.h>
WSADATA wsaData;
SOCKET s;
SOCKADDR_IN ServerAddr;
int Ret;
int Port = 8080;
int main()
{
//1.加载和初始化网络库
if ((Ret = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
{
printf("WSAStarup faiked with error. %d\n", Ret);
}
//2.创建套接字
if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
printf("socket filed with error. %d\n", WSAGetLastError());
WSACleanup();
}
//3.开始链接
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port); //链接的端口
ServerAddr.sin_addr.S_un.S_addr = inet_addr("116.xx.xx.xxx"); //
// printf("We are trying to connect to %s:%d...\n", inet_ntoa(ServerAddr.sin_addr), htons(ServerAddr.sin_port));
//4.链接
if ((connect(s, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr))) == SOCKET_ERROR)
{
printf("connect failed with error. %d\n", WSAGetLastError());
closesocket(s);
WSACleanup();
}
else
{
printf("和服务器链接成功!\n");
}
//拼接http字符串格式
char str1[4096];
memset(str1, 0, 4096);
strcat(str1, "POST /mobile/bind.do HTTP/1.1\n"); //请求行: |请求方式|空格|你要访问的具体位置|空格|http版本|换行符号|
strcat(str1, "Host: xxx.xx.xx.xxx:8080\n"); //请求头: |key头名字段|冒号|值|换行符号|
strcat(str1, "mobile: xxxxxxx\n");
strcat(str1, "password: xxx\n");
strcat(str1, "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\n");// body数据类型: |Content-Type|冒号|xxxxxxxx|分号|xxxxxx|换行符号|
strcat(str1, "Content-Length: 25\n"); // body递字符的个数: |Content-Length|冒号|个数|换行符号|
strcat(str1, "\n"); // header和body隔开:|换行符号|
strcat(str1, "binding-device=xxxxxxxxx\n"); // body : |xxxxx|换行符号|
//5.发送http格式的数据
if ((Ret = send(s, str1, sizeof(str1), 0)) == SOCKET_ERROR)
{
printf("Sent failed with error %d.\n", WSAGetLastError());
closesocket(s);
WSACleanup();
}
else
{
printf("已经发送http格式的数据!\n");
}
//接收http返回
char DataBuffer[10240];//缓存客服端发送的数据
//6.用客服端的套接字去接收,客服端的数据,函数“recv”
if ((Ret = recv(s, DataBuffer, sizeof(DataBuffer), 0)) == SOCKET_ERROR)
{
printf("recv failed with error %d\n", WSAGetLastError());
closesocket(s);
WSACleanup();
}
//到这一行http请求返回的数据已经存入DataBuffer中
else
{
//显示
wchar_t *pwText = NULL;
DataBuffer[Ret] = '\0';
DWORD dwNum = MultiByteToWideChar(CP_UTF8, 0, DataBuffer, -1, NULL, 0); //返回原始ASCII码的字符数目
pwText = new wchar_t[dwNum]; //根据ASCII码的字符数分配UTF8的空间
MultiByteToWideChar(CP_UTF8, 0, DataBuffer, -1, pwText, dwNum); //将ASCII码转换成UTF8
int iSize;
char* pszMultiByte;
iSize = WideCharToMultiByte(CP_ACP, 0, pwText, -1, NULL, 0, NULL, NULL); //iSize =wcslen(pwsUnicode)+1=6
pszMultiByte = (char*)malloc(iSize * sizeof(char)); //不需要 pszMultiByte = (char*)malloc(iSize*sizeof(char)+1);
WideCharToMultiByte(CP_ACP, 0, pwText, -1, pszMultiByte, iSize, NULL, NULL);
printf("====================http请求成功:=================\n\n%s\n\n=================================================\n",
pszMultiByte);
}
closesocket(s);
WSACleanup();
system("pause");
return 0;
}