wince 中使用HttpSendRequest函数POST数据时应该注意的一点

 

测试用例代码

 CString szHeaders;
 szHeaders ="EmployeeID: "+UserID+"/r/n";
 szHeaders+="EmployeePassword: "+Password+"";
 
// HTTPRequest Response;
// memset(&Response, NULL, sizeof(HTTPRequest));
// if (!MCHttp.SendRequestEx(m_VerbType, szURL, HTTP_VERSION_1_1, TEXT("*/*"), TEXT("PervasiveBiz"), szHeaders,
//      szSendBuffer, 60000, &Response))
 CString strServerName;
 CString strObject;
 INTERNET_PORT nPort;
 DWORD dwServiceType; 
 if (!AfxParseURL(szURL, dwServiceType, strServerName, strObject, nPort) ||
  dwServiceType != AFX_INET_SERVICE_HTTPS && dwServiceType != AFX_INET_SERVICE_HTTP)
 {
  return -2;
 }

 HINTERNET m_hOpen;
    HINTERNET m_hConnect;
    HINTERNET m_hRequest;  
 m_hOpen = InternetOpen(TEXT("PervasiveBiz"), INTERNET_OPEN_TYPE_DIRECT,NULL, 0, 0);
 if (!m_hOpen)
 {
  return -1;
 }
 
 if (!(m_hConnect = InternetConnect(m_hOpen, strServerName,  nPort,  NULL, NULL, dwServiceType,  0, 0)))
 {
  InternetCloseHandle(m_hOpen);
  return -1;
 }
 
 LPTSTR AcceptTypes[2] = {TEXT("*/*"), NULL};
 DWORD dwFlags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE;
 // Open an HTTP request handle.

 if (!(m_hRequest = HttpOpenRequest (m_hConnect, TEXT("POST"), strObject, HTTP_VERSION, NULL, (LPCTSTR*)AcceptTypes,
   dwFlags, 0)))
 {
  InternetCloseHandle(m_hConnect);
  InternetCloseHandle(m_hOpen);
  return -1;
 }
 
 DWORD dwHttpTimeout = TIME_OUT;
 if(!InternetSetOption(m_hRequest,INTERNET_OPTION_CONNECT_TIMEOUT,&dwHttpTimeout,sizeof(DWORD)))
 {
  InternetCloseHandle(m_hRequest);
  InternetCloseHandle(m_hConnect);
  InternetCloseHandle(m_hOpen);
  return -1;
 }
 if(!InternetSetOption(m_hRequest,INTERNET_OPTION_SEND_TIMEOUT,&dwHttpTimeout,sizeof(DWORD)))
 {
  InternetCloseHandle(m_hRequest);
  InternetCloseHandle(m_hConnect);
  InternetCloseHandle(m_hOpen);
  return -1;
 }
 if(!InternetSetOption(m_hRequest,INTERNET_OPTION_RECEIVE_TIMEOUT,&dwHttpTimeout,sizeof(DWORD)))
 {
  InternetCloseHandle(m_hRequest);
  InternetCloseHandle(m_hConnect);
  InternetCloseHandle(m_hOpen);;
  return -1;
 }

// MessageBox(NULL,  szSendBuffer,szHeaders, 0);

重点要注意的地方,HttpSendRequest的第三个参数必须为多字节编码格式,否则服务器端会出错的。花了一天半的时间调试出来的结论。如果不进行转换,服务器端只会接收一半数据,后面的数据将会收不到。
 byte* pszData = new byte[szSendBuffer.GetLength()];
 char *pConten = new char[szSendBuffer.GetLength()];
 memset(pszData,0,szSendBuffer.GetLength());
 memset(pConten,0,szSendBuffer.GetLength());
 WideCharToMultiByte( CP_ACP, 0, szSendBuffer.GetBuffer(0),
   -1, pConten, szSendBuffer.GetLength(), NULL, NULL );
 memcpy(pszData, pConten, szSendBuffer.GetLength());
 
 int len = strlen((char*)pszData);
 int len2 = szSendBuffer.GetLength();
 //MessageBox(NULL, szSendBuffer, str);
 if(HttpSendRequest(m_hRequest, szHeaders, szHeaders.GetLength(), pszData, szSendBuffer.GetLength())
   == FALSE)
 {
  InternetCloseHandle(m_hRequest);
  InternetCloseHandle(m_hConnect);
  InternetCloseHandle(m_hOpen);
  return -1;  
 }

 DWORD dwSize;
 HttpQueryInfo(m_hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, NULL, &dwSize,NULL);

 TCHAR* lpHeaders = new TCHAR [dwSize];
 if (!HttpQueryInfo (m_hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, (LPVOID) lpHeaders, &dwSize, NULL))
 {
  InternetCloseHandle(m_hRequest);
  InternetCloseHandle(m_hConnect);
  InternetCloseHandle(m_hOpen);
  delete[] lpHeaders;
  return -1;
 }
 
// MessageBox(NULL, lpHeaders, _T("HttpQueryInfo"),  0);

 TCHAR szHttpStatus[4] = {0};
 memcpy(szHttpStatus,lpHeaders+wcslen(_T("HTTP/1.1 ")),3*sizeof(TCHAR));
 int dwHttpStatus = 0;
 dwHttpStatus =_wtoi(szHttpStatus);
 if ((dwHttpStatus<200)||(dwHttpStatus>300))
 {
  InternetCloseHandle(m_hRequest);
  InternetCloseHandle(m_hConnect);
  InternetCloseHandle(m_hOpen);
  delete[] lpHeaders;
  return -1;
 }

 if(!InternetReadFile (m_hRequest, (LPVOID)(cResponse),32*1024, &dwSize))
 {
  InternetCloseHandle(m_hRequest);
  InternetCloseHandle(m_hConnect);
  InternetCloseHandle(m_hOpen);
  delete[] lpHeaders; 

  return -1;
 }
 if(dwSize == 0)
 {
  InternetCloseHandle(m_hRequest);
  InternetCloseHandle(m_hConnect);
  InternetCloseHandle(m_hOpen);
  delete[] lpHeaders; 
  return -1;  
 }
 

 HttpQueryInfo(m_hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, NULL, &dwSize,NULL);
 if (!HttpQueryInfo (m_hRequest, HTTP_QUERY_RAW_HEADERS_CRLF,
   (LPVOID) lpHeaders, &dwSize, NULL))
 {
  InternetCloseHandle(m_hRequest);
  InternetCloseHandle(m_hConnect);
  InternetCloseHandle(m_hOpen);
  delete[] lpHeaders; 
  return -1;
 }
 
 memcpy(szHttpStatus,lpHeaders+wcslen(_T("HTTP/1.1 ")),3*sizeof(TCHAR));
 dwHttpStatus = _wtoi(szHttpStatus);
 if ((dwHttpStatus<200)||(dwHttpStatus>300))
 {
  InternetCloseHandle(m_hRequest);
  InternetCloseHandle(m_hConnect);
  InternetCloseHandle(m_hOpen);
  delete[] lpHeaders;
  return -1;
 }

// MessageBox(NULL, lpHeaders, _T("lpHeaders"),  0);
 delete[] lpHeaders; 
 InternetCloseHandle(m_hRequest);
 InternetCloseHandle(m_hConnect);
 InternetCloseHandle(m_hOpen);
 return SENDDATA_SCUCCEED ;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值