HTTP 请求格式


    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;

}







 
 
 
 
 
 
 
 
 
 
 

                
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值