MFC http post请求url带参数

fxbszj 2015-12-28 06:45:21
如题,我需要向web端服务器post一些数据,对方给我的url的后面带个 ?sessionid= (sessionid内容,已提前获取)
我原来是这样
CHttpFile* pFile = pConnection->OpenRequest( CHttpConnection::HTTP_VERB_POST,
obj + sessionid);

发现总是404
而另外一个url后面没有带sessionid的,其他全部过程一致,完全没有问题。
我猜想sessionid不能这么放,请问该怎么做?
谢谢
...全文
733 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxbszj 2015-12-30
  • 打赏
  • 举报
回复
没有有用的。。。
zhouxiaofeng1021 2015-12-29
  • 打赏
  • 举报
回复
#pragma once

class CHttpClient
{
public:
CHttpClient(void);
~CHttpClient(void);

// Implementation
public:
/*********
* 利用HTTP协议从服务器端读取数据
*strIP: HTTP 服务器IP
*dwPort:HTTP 端口
*strAgent:客户端名称
*strUriFmt:the specified HTTP verb
********/
static BOOL ReadBuffer(CString strIP,DWORD dwPort,CString strAgent,CString strUriFmt,CString& strRead);

/*********
* 利用HTTP协议向服务器端发送文件
*strIP: HTTP 服务器IP
*dwPort:HTTP 端口
*strAgent:客户端名称
*strUriFmt:the specified HTTP verb
*strPath: 文件路径
*strFileName:文件名称
********/
static void SendFile(CString strIP,DWORD dwPort,CString strAgent,CString strUriFmt,CString strPath,CString strFileName);


/*********
* 利用HTTP协议向服务器端下载文件
*strIP: HTTP 服务器IP
*dwPort:HTTP 端口
*strAgent:客户端名称
*strUriFmt:the specified HTTP verb
*strSavePath: 文件保存路径
*strFileName:需要下载的文件名称
********/
static BOOL DownLoadFile(CString strIP,DWORD dwPort,CString strAgent,CString strUri,CString strSavePath,CString strFileName);
};

#include "StdAfx.h"
#include "HttpClient.h"
#include <Winhttp.h>
#include <regex>
#include "TMSSAutoUpdate.h"
CHttpClient::CHttpClient(void)
{
}

CHttpClient::~CHttpClient(void)
{
}

/*********
* 利用HTTP协议从服务器端读取数据
*strIP: HTTP 服务器IP
*dwPort:HTTP 端口
*strAgent:客户端名称
*strUriFmt:the specified HTTP verb
********/
BOOL CHttpClient::ReadBuffer(CString strIP,DWORD dwPort,CString strAgent,CString strUriFmt,CString& strRead)
{
strRead = _T("");

DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer = NULL;
HINTERNET hSession = NULL;
HINTERNET hConnect = NULL;
HINTERNET hRequest = NULL;

hSession=WinHttpOpen(strAgent ,WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,WINHTTP_NO_PROXY_NAME,WINHTTP_NO_PROXY_BYPASS,0);
if(hSession == NULL)
return FALSE;

hConnect=WinHttpConnect(hSession,strIP.GetBuffer(),static_cast<INTERNET_PORT>(dwPort),0);
if(hConnect == NULL)
{
WinHttpCloseHandle(hSession);
return FALSE;
}

hRequest=WinHttpOpenRequest(hConnect, _T("GET"),strUriFmt,_T("HTTP/1.1"), WINHTTP_NO_REFERER,WINHTTP_DEFAULT_ACCEPT_TYPES,0);
if(hRequest == NULL)
{
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return FALSE;
}

BOOL bResults = WinHttpSendRequest(hRequest,WINHTTP_NO_ADDITIONAL_HEADERS, 0,WINHTTP_NO_REQUEST_DATA, 0, 0, 0 );
if(bResults)
{
bResults=WinHttpReceiveResponse(hRequest, NULL);
if(bResults)
{
do
{
// Check for available data.
dwSize = 0;
if (!WinHttpQueryDataAvailable(hRequest, &dwSize))
{
CString strlog;
strlog.Format(_T("Error %u in WinHttpQueryDataAvailable.\n"), GetLastError());
WriteLog(strlog.GetBuffer());
break;
}

if (!dwSize)
break;

pszOutBuffer = new CHAR[dwSize+1];
if (!pszOutBuffer)
{
WriteLog(_T("Out of memory\n"));
break;
}

ZeroMemory(pszOutBuffer, dwSize+1);
if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded))
{
CString strlog;
strlog.Format(_T("Error %u in WinHttpReadData.\n"), GetLastError());
WriteLog(strlog.GetBuffer());
}

if (!dwDownloaded)
break;

if (pszOutBuffer && strlen(pszOutBuffer) > 0 )
{
std::wstring wstr = ANSIToUnicode(pszOutBuffer, CP_UTF8);
strRead = strRead + wstr.c_str();
}
else
strRead = strRead +_T("");

//释放内存
delete[] pszOutBuffer;
pszOutBuffer = NULL;

} while (dwSize > 0);
}

if (pszOutBuffer)
{
//释放内存
delete[] pszOutBuffer;
pszOutBuffer = NULL;
}
}

if (hRequest)
WinHttpCloseHandle(hRequest);
if (hConnect)
WinHttpCloseHandle(hConnect);
if (hSession)
WinHttpCloseHandle(hSession);

return bResults;
}
/*********
* 利用HTTP协议向服务器端发送文件
*strIP: HTTP 服务器IP
*dwPort:HTTP 端口
*strAgent:客户端名称
*strUriFmt:the specified HTTP verb _T("TMSSUpdateService.svc/Add/")
*strPath: 文件路径
*strFileName:文件名称
********/
void CHttpClient::SendFile(CString strIP,DWORD dwPort,CString strAgent,CString strUriFmt,CString strPath,CString strFileName)
{
DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer = NULL;
HINTERNET hSession = NULL, hConnect = NULL, hRequest = NULL;

CFile source;
CFileException ex;
if (!source.Open(strPath + _T("\\") + strFileName, CFile::modeRead | CFile::shareDenyWrite, &ex))
{
TCHAR szError[1024];
ex.GetErrorMessage(szError, 1024);
CString strlog;
strlog.Format(_T("Couldn't open source file: %1024s"), szError);
WriteLog(strlog.GetBuffer());
return;
}

DWORD dwLength(static_cast<DWORD>(source.GetLength() ) );
BYTE* buffer = new BYTE[dwLength+1];
memset(buffer, 0, dwLength+1);

DWORD dwRead = 0;
DWORD dwReady = 0;
do
{
dwRead = source.Read(buffer+dwReady, dwLength);
dwReady += dwRead;
dwLength -= dwRead;
}while (dwRead > 0);

source.Close();

BOOL bResults = FALSE;
hSession=WinHttpOpen(strAgent,WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,WINHTTP_NO_PROXY_NAME,WINHTTP_NO_PROXY_BYPASS,0);
hConnect=WinHttpConnect(hSession,strIP,static_cast<INTERNET_PORT>(dwPort),0);
if(!hConnect)
{
WriteLog(_T("Connect to server failed.\n"));
::WinHttpCloseHandle(hSession);
delete[] buffer;
buffer = NULL;
return;
}

const wchar_t* lpszAcceptedType[] = {L"*/*", NULL};
CString strUri = strUriFmt + strFileName;
hRequest=WinHttpOpenRequest(hConnect, _T("POST"),strUri,_T("HTTP/1.1"),WINHTTP_NO_REFERER,lpszAcceptedType,0);
if (!hRequest)
{
WriteLog(_T("Request uri failed.\n"));
::WinHttpCloseHandle(hConnect);
::WinHttpCloseHandle(hSession);
delete[] buffer;
buffer = NULL;
return;
}

DWORD dwTime = 5000;
::WinHttpSetOption(hRequest, WINHTTP_OPTION_CONNECT_TIMEOUT, &dwTime, sizeof(DWORD));
std::wstring strHeader = L"Content-Type: application/octet-stream; boundary=--boundary_TMSSService\r\n";
::WinHttpAddRequestHeaders(hRequest, strHeader.c_str(), strHeader.length(), WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE);

//分步写入
::WinHttpSendRequest(hRequest, NULL, 0, NULL, 0, dwReady, 0);
DWORD dwWritten = 0;
dwLength = 0;
while(dwWritten < dwReady)
{
::WinHttpWriteData(hRequest, buffer+dwWritten, dwReady-dwWritten, &dwLength);
dwWritten += dwLength;
dwLength = 0;
}
::WinHttpReceiveResponse(hRequest, NULL);


memset(buffer, 0, dwLength+1);
dwRead = 0;
::WinHttpReadData(hRequest, buffer, dwLength, &dwRead);
if (buffer)
delete[] buffer;

if (hRequest)
WinHttpCloseHandle(hRequest);
if (hConnect)
WinHttpCloseHandle(hConnect);
if (hSession)
WinHttpCloseHandle(hSession);
}

/*********
* 利用HTTP协议向服务器端下载文件
*strIP: HTTP 服务器IP
*dwPort:HTTP 端口
*strAgent:客户端名称
*strUriFmt:the specified HTTP verb
*strSavePath: 文件保存路径
*strFileName:需要下载的文件名称
********/
BOOL CHttpClient::DownLoadFile(CString strIP,DWORD dwPort,CString strAgent,CString strUri,CString strSavePath,CString strFileName)
{

DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer = NULL;
HINTERNET hSession = NULL;
HINTERNET hConnect = NULL;
HINTERNET hRequest = NULL;

BOOL bResults = FALSE;
hSession=WinHttpOpen(strAgent, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
if(hSession)
hConnect=WinHttpConnect(hSession, strIP, static_cast<INTERNET_PORT>(dwPort), 0);

if(hConnect)
{
hRequest=WinHttpOpenRequest(hConnect, _T("GET"), strUri, _T("HTTP/1.1"), WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
}

if(hRequest)
bResults=WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0 );

if(bResults)
bResults=WinHttpReceiveResponse(hRequest, NULL);

if(bResults)
{
CFile file(strSavePath + _T("\\") + strFileName, CFile::modeCreate|CFile::modeReadWrite);

do
{
// Check for available data.
dwSize = 0;
if (!WinHttpQueryDataAvailable(hRequest, &dwSize))
{
_tprintf(_T("Error %u in WinHttpQueryDataAvailable.\n"),GetLastError());
break;
}

if (dwSize == 0)
break;

pszOutBuffer = new CHAR[dwSize+1];
if (!pszOutBuffer)
{
_tprintf(_T("Out of memory\n"));
break;
}

ZeroMemory(pszOutBuffer, dwSize+1);
if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded))
{
_tprintf(_T("Error %u in WinHttpReadData.\n"), GetLastError());
}

file.Write(pszOutBuffer, dwDownloaded);
delete[] pszOutBuffer;
pszOutBuffer = NULL;

if (!dwDownloaded)
break;

} while (dwSize > 0);
file.Flush();
file.Close();
}

if (pszOutBuffer)
{
//释放内存
delete[] pszOutBuffer;
pszOutBuffer = NULL;
}

if (hRequest)
WinHttpCloseHandle(hRequest);
if (hConnect)
WinHttpCloseHandle(hConnect);
if (hSession)
WinHttpCloseHandle(hSession);

return TRUE;
}

fxbszj 2015-12-29
  • 打赏
  • 举报
回复
引用 2 楼 CharlesSimonyi 的回复:
你的URL不是用AfxParseURL解析的吗?
不带jsessionid:
AfxParseURL(“http://192.168.1.150:8080/offline/secutity/employee/addMedicare.json”,  ...);
带jsessionid:
AfxParseURL(“http://192.168.1.150:8080/offline/secutity/employee/addMedicare.json?jsessionid=afadafdfad”,  ...);
不是用AfxParseURL解析的,我直接拆分了,在配置文件里配的 而且这个函数我也看了,也就得到个server object 和port,如果说唯一能放后面那个jsessionid=*****的那部分,也只有object了(或者就不该放这里),我开始就放object来用的,就是不行
fxbszj 2015-12-29
  • 打赏
  • 举报
回复
引用 3 楼 oyljerry 的回复:
先看你的URL是否正确,其次就是抓包对比一下,看是不是你提交的数据格式有问题
url当然没有问题啦?直接浏览器输服务端那边是能看到的,直接拼接在pstrObjectName后面就是不行
oyljerry 2015-12-29
  • 打赏
  • 举报
回复
先看你的URL是否正确,其次就是抓包对比一下,看是不是你提交的数据格式有问题
encoderlee 2015-12-28
  • 打赏
  • 举报
回复
你的URL不是用AfxParseURL解析的吗?
不带jsessionid:
AfxParseURL(“http://192.168.1.150:8080/offline/secutity/employee/addMedicare.json”, ...);
带jsessionid:
AfxParseURL(“http://192.168.1.150:8080/offline/secutity/employee/addMedicare.json?jsessionid=afadafdfad”, ...);
fxbszj 2015-12-28
  • 打赏
  • 举报
回复
http://192.168.1.150:8080/offline/secutity/employee/addMedicare.json;jsessionid=afadafdfad 就是这样

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧