`
冤大头_718
  • 浏览: 23898 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

C++中发送HTTP请求把数据上传

    博客分类:
  • C++
c++ 
阅读更多
下面的代码是C++中发送HTTP请求代码:
  1、PostConnect(CString url,const CString &strPara,CString &strContent, CString &strDescript)发送Http请求.url:要请求的地址,
strPara请求的参数.strContent 服务器返回的信息.strDescript程序执行信息.
  2、可能请求中的参数有存在中文字符的关系,可能会存在乱码,所以附带了2个转码的方法。
下面贴出代码:
PostConn.h
#pragma once
#include "afxinet.h"

class CPostConn
{
public:
	CPostConn();
	~CPostConn();

public:
	bool PostConnect(CString url,const CString &strPara,CString &strContent, CString &strDescript);
	void GBKToUTF8(CString &strGBK);
	void UTF8ToGBK(CString &str);
};

PostConn.cpp
#include "stdafx.h"
#include "PostConn.h"

CPostConn::CPostConn()
{

}

CPostConn::~CPostConn()
{

}

bool CPostConn::PostConnect(CString url,const CString &strPara,CString &strContent, CString &strDescript)
{
	try
	{
		strDescript="提交成功完成";
		bool bRet=false;
		CString strServer, strObject, strHeader, strRet;  
		unsigned short nPort;
		DWORD dwServiceType; 
		if(!AfxParseURL(url,dwServiceType,strServer,strObject,nPort))
		{
			strDescript="不是有效的网络地址";
			return false;
		}

		CInternetSession sess;

		CHttpFile *pFile;

		CHttpConnection *pServer=sess.GetHttpConnection(strServer,nPort);

		if(pServer==NULL)
		{
			strDescript = "对不起,连接服务器失败!";  
			return false;

		}

		pFile=pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,strObject,NULL,1,
									NULL,NULL,INTERNET_FLAG_EXISTING_CONNECT);
		if(pFile == NULL)  
		{  
			strDescript = "找不到网络地址" + url;  
			 return false;  
		}  

		CString strHeaders = _T("Content-Type: application/x-www-form-urlencoded");
		pFile->AddRequestHeaders(strHeaders);
		pFile->AddRequestHeaders("Accept: */*");
		pFile ->SendRequest(NULL,0,(LPTSTR)(LPCTSTR)strPara, strPara.GetLength());

		CString strSentence;
		DWORD dwStatus;
		DWORD dwBuffLen = sizeof(dwStatus);
		BOOL bSuccess = pFile->QueryInfo(
			HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
			&dwStatus, &dwBuffLen);

		if( bSuccess && dwStatus>=  200 && dwStatus<300)
		{
			char buffer[256];
			memset(buffer, 0, 256);
			int nReadCount = 0;
			while((nReadCount = pFile->Read(buffer, 2048)) > 0)
			{
				strContent += buffer;
				memset(buffer, 0, 256);
			}
			bRet = true;
		}
		else
		{
			strDescript = "网站服务器错误" + url;
			bRet = false;
		}
		////////////////////////////////////////
		pFile->Close();
		sess.Close();
		return bRet;

	}
	catch (...)
	{
		int nCode = GetLastError();
		strDescript.Format("向服务器post失败!错误号:%d", nCode);
		return false;
	}
}


void CPostConn::GBKToUTF8(CString &strGBK)
{
	WCHAR * str1;
	int n = MultiByteToWideChar(CP_ACP, 0, strGBK, -1, NULL, 0);
	str1 = new WCHAR[n];
	MultiByteToWideChar(CP_ACP, 0, strGBK, -1, str1, n);
	n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
	char * str2 = new char[n];
	WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
	strGBK = str2;
	delete[]str1;
	str1 = NULL;
	delete[]str2;
	str2 = NULL;
}

void CPostConn::UTF8ToGBK(CString &str)
{
	WCHAR* strSrc;
	TCHAR* szRes;
	int i=MultiByteToWideChar(CP_UTF8,0,str,-1,NULL,0);
	strSrc=new WCHAR[i=1];
	MultiByteToWideChar(CP_UTF8,0,str,-1,strSrc,i);
	i=WideCharToMultiByte(CP_ACP,0,strSrc,-1,NULL,0,NULL,NULL);
	szRes=new TCHAR[i];
	WideCharToMultiByte(CP_ACP,0,strSrc,-1,szRes,i,NULL,NULL);
	str=szRes;
	delete []strSrc;
	delete []szRes;
}

记录下来,方便以后.
分享到:
评论

相关推荐

    C++使用libcurl提供的API上传文件且Post表单数据

    用form-data 表单形式发送数据,并且上传文件,完整示例,使用libcurl提供的API上传文件。项目使用Vc++ 6.0 和 VS 2017同时编译通过,上传表单数据和文件测试成功。

    煤炭产量远程监测系统主站数据定时传输软件的设计

    针对现有煤炭产量远程监测系统中主站无法精确定时向监控中心传输数据的问题,结合《煤炭产量远程监测系统使用与管理规范》的要求,采用Visual C++设计了一种主站数据定时传输软件。该软件采用Windows多线程技术和主动...

    课程作业基于c++实现收发并解析TCPIP协议栈中的数据包源码+项目说明.zip

    - 截获并分析TCP/IP网络协议栈中的各层协议数据包(包括以太网MAC帧、ARP请求分组、IP数据报、TCP报文段、UDP报文段、ICMP报文段) - 将统计信息和数据输出到文件 ### 题目 项目2:发送和接收TCP数据包 (a) TCP...

    基于C++实现的HTTP服务器改进版源码+项目使用说明+详细注释.zip

    建立监听数据集(新连接会加入一个数据集和时间结点,新信息读入会读取数据集并修改时间结点),基于sigaction形式实现对信号和信号处理函数的绑定,信号处理函数向管道发送信号消息,主线程监听到管道消息读入后...

    基于Qt和C++开发的网盘系统源码(含客户端+服务端)+项目说明+详细注释.zip

    【资源说明】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载食用体验! 2.主要针对各个计算机相关专业,...客户端上传文件以字节流传输,使用定时器(Qtimer型指针)避免文件出现粘包(文件内容与请求)情况。

    基于c++和Nginx开发的分布式文件传输系统源码+项目说明+exe可执行程序(课程大作业).tar

    注意:因为fastdfs不能直接解析http请求,所以需要先安装nginx-fastdfs插件,也就是先让nginx解析,在发送给fastdfs 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有...

    基于QT(C++)实现(窗体)UDP文件原型【100010516】

    基础功能 ...通过sha-256安全散列算法,发送端给文件二进制打上哈希值,接受端验证,若哈希值不同则请求重传,实现文件校验功能。 服务端实现模拟丢包和模拟失真,来验证超时重传和哈希证两个功能的效果。

    纯C语言写的https模拟GET和POST

    纯C语言写的https客户端,支持http及https的模拟GET和POST提交, 最大优势... 本次上传的是vc6下的完整工程的压缩包,解压后可直接使用。若要在linux下编译和运行,可按照压缩包内Linux下编译运行https的帮助文档来操作。

    PHP论文格式化系统-前台的设计与实现(源代码+论文)

    在接收到送服务器端发送来的数据之后,系统用javascript脚本解析然后填写到表单中去.他们可以按时的发表自己的论文.系统也提供学生和导师的论文交互平台,论文交互平台采用了php 脚本编写了数据库操作类和常用函数类,...

    asp.net知识库

    一个.net发送HTTP数据实体的类 按键跳转以及按Enter以不同参数提交,及其他感应事件 动态控制Page页的Head信息 SubmitOncePage:解决刷新页面造成的数据重复提交问题 SharpRewriter:javascript + xml技术利用#实现...

    JAVA上百实例源码以及开源项目源代码

    Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非...

    Python Cookbook

    2.12 将二进制数据发送到Windows的标准输出 77 2.13 使用C++的类iostream语法 78 2.14 回退输入文件到起点 80 2.15 用类文件对象适配真实文件对象 83 2.16 遍历目录树 84 2.17 在目录树中改变文件扩展名 85 ...

    Android开发案例驱动教程 配套代码

    注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式展开讲解知识点,即介绍案例-&gt;案例涉及...

Global site tag (gtag.js) - Google Analytics