当前位置: 首页 > news >正文

网站开发需求目标温州网站设计方案

网站开发需求目标,温州网站设计方案,深圳响应式网页设计,十堰网站设计首先#xff0c;微软提供的WinInet库封装了对网页访问的方法。 最近工作需要从https服务器获取数据#xff0c;都知道https和http网页的访问方式不同#xff0c;多了一道证书认证程序#xff0c;这样就使得https在请求起来比http要复杂的多#xff1b;好在#xff0c;Win…      首先微软提供的WinInet库封装了对网页访问的方法。      最近工作需要从https服务器获取数据都知道https和http网页的访问方式不同多了一道证书认证程序这样就使得https在请求起来比http要复杂的多好在WinInet库中提供了对https网页请求的处理这样就不需要在使用openssl中的一些方法来复杂化程序了。      下面贴上我的解决前的代码再对比我遇到问题之后的代码在通过实际遇到的问题和环境来阐述   解决前代码 #include cstdio #include cstdlib #include iostream #include fstream #include Windows.h #include wininet.h using namespace std; //链接需要 wininet.lib #pragma comment(lib,wininet.lib) int main(int argc, char* argv[]) {LPCTSTR lpszAgent WinInetGet/0.1;//初始化HINTERNET hInternet InternetOpen(lpszAgent,INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);LPCTSTR lpszServerName data.btcchina.com;//ssl.google-analytics.com; //设置serverINTERNET_PORT nServerPort INTERNET_DEFAULT_HTTPS_PORT; // HTTPS端口443LPCTSTR lpszUserName NULL; //无登录用户名LPCTSTR lpszPassword NULL; //无登录密码DWORD dwConnectFlags 0;DWORD dwConnectContext 0;//连接HINTERNET hConnect InternetConnect(hInternet,lpszServerName, nServerPort,lpszUserName, lpszPassword,INTERNET_SERVICE_HTTP,dwConnectFlags, dwConnectContext);//使用GetLPCTSTR lpszVerb GET;LPCTSTR lpszObjectName /data/ticker;LPCTSTR lpszVersion NULL; // 默认.LPCTSTR lpszReferrer NULL; // 没有引用页LPCTSTR *lplpszAcceptTypes NULL; // Accpet所有类型.DWORD dwOpenRequestFlags INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |INTERNET_FLAG_KEEP_CONNECTION |INTERNET_FLAG_NO_AUTH |INTERNET_FLAG_NO_COOKIES |INTERNET_FLAG_NO_UI |//设置启用HTTPSINTERNET_FLAG_SECURE |INTERNET_FLAG_RELOAD;DWORD dwOpenRequestContext 0;//初始化RequestHINTERNET hRequest HttpOpenRequest(hConnect, lpszVerb, lpszObjectName, lpszVersion,lpszReferrer, lplpszAcceptTypes,dwOpenRequestFlags, dwOpenRequestContext);//发送Request HttpSendRequest(hRequest, NULL, 0, NULL, 0); //获得HTTP Response Header信息DWORD dwInfoLevel HTTP_QUERY_RAW_HEADERS_CRLF;DWORD dwInfoBufferLength 2048;BYTE *pInfoBuffer (BYTE *)malloc(dwInfoBufferLength 2);while(!HttpQueryInfo(hRequest, dwInfoLevel, pInfoBuffer, dwInfoBufferLength, NULL)) {DWORD dwError GetLastError();if(dwError ERROR_INSUFFICIENT_BUFFER) {free(pInfoBuffer);pInfoBuffer (BYTE *)malloc(dwInfoBufferLength 2);} else {fprintf(stderr, HttpQueryInfo failed, error %d (0x%x)/n,GetLastError(), GetLastError());break;}}pInfoBuffer[dwInfoBufferLength] /0;pInfoBuffer[dwInfoBufferLength 1] /0;printf(%S, pInfoBuffer); //很奇怪HttpQueryInfo保存的格式是wchar_t 和下面的InternetReadFile不一样free(pInfoBuffer);//HTTP Response 的 Body, 需要的内容就在里面DWORD dwBytesAvailable;while(InternetQueryDataAvailable(hRequest, dwBytesAvailable, 0, 0)) {BYTE *pMessageBody (BYTE *)malloc(dwBytesAvailable 1);DWORD dwBytesRead;BOOL bResult InternetReadFile(hRequest, pMessageBody,dwBytesAvailable, dwBytesRead);if(!bResult) {fprintf(stderr, InternetReadFile failed, error %d (0x%x)/n,GetLastError(), GetLastError());break;}if(dwBytesRead 0)break; // End of File.pMessageBody[dwBytesRead] /0;printf(%s, pMessageBody); //InternetReadFile读出来的是普通的char. InternetReadFileEx 似乎是有宽字节版本的 ofstream out(ofs.txt);std::string s (char *)pMessageBody;out s.c_str() endl;free(pMessageBody);}getchar(); }   解决后代码 #include cstdio #include cstdlib #include iostream #include fstream #include Windows.h #include wininet.husing namespace std; //链接需要 wininet.lib #pragma comment(lib,wininet.lib)int main(int argc, char* argv[]) {LPCTSTR lpszAgent WinInetGet/0.1;//初始化HINTERNET hInternet InternetOpen(lpszAgent,INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);LPCTSTR lpszServerName data.btcchina.com;//ssl.google-analytics.com; //设置serverINTERNET_PORT nServerPort INTERNET_DEFAULT_HTTPS_PORT; // HTTPS端口443LPCTSTR lpszUserName NULL; //无登录用户名LPCTSTR lpszPassword NULL; //无登录密码DWORD dwConnectFlags 0;DWORD dwConnectContext 0;//连接HINTERNET hConnect InternetConnect(hInternet,lpszServerName, nServerPort,lpszUserName, lpszPassword,INTERNET_SERVICE_HTTP,dwConnectFlags, dwConnectContext);//使用GetLPCTSTR lpszVerb GET;LPCTSTR lpszObjectName /data/ticker;LPCTSTR lpszVersion NULL; // 默认.LPCTSTR lpszReferrer NULL; // 没有引用页LPCTSTR *lplpszAcceptTypes NULL; // Accpet所有类型.DWORD dwOpenRequestFlags INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |INTERNET_FLAG_KEEP_CONNECTION |INTERNET_FLAG_NO_AUTH |INTERNET_FLAG_NO_COOKIES |INTERNET_FLAG_NO_UI |//设置启用HTTPSINTERNET_FLAG_SECURE |INTERNET_FLAG_RELOAD;DWORD dwOpenRequestContext 0;//初始化RequestHINTERNET hRequest HttpOpenRequest(hConnect, lpszVerb, lpszObjectName, lpszVersion,lpszReferrer, lplpszAcceptTypes,dwOpenRequestFlags, dwOpenRequestContext);//发送Request again:DWORD dwError 0;if (!HttpSendRequest(hRequest, NULL, 0, NULL, 0)){dwError GetLastError();}if (dwError ERROR_INTERNET_INVALID_CA){fprintf(stderr, HttpSendRequest failed, error %d (0x%x)/n,dwError, dwError );DWORD dwFlags;DWORD dwBuffLen sizeof(dwFlags);InternetQueryOption(hRequest, INTERNET_OPTION_SECURITY_FLAGS,(LPVOID)dwFlags, dwBuffLen);dwFlags | SECURITY_FLAG_IGNORE_UNKNOWN_CA;InternetSetOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS,dwFlags, sizeof(dwFlags));goto again;}//获得HTTP Response Header信息DWORD dwInfoLevel HTTP_QUERY_RAW_HEADERS_CRLF;DWORD dwInfoBufferLength 2048;BYTE *pInfoBuffer (BYTE *)malloc(dwInfoBufferLength 2);while(!HttpQueryInfo(hRequest, dwInfoLevel, pInfoBuffer, dwInfoBufferLength, NULL)) {DWORD dwError GetLastError();if(dwError ERROR_INSUFFICIENT_BUFFER) {free(pInfoBuffer);pInfoBuffer (BYTE *)malloc(dwInfoBufferLength 2);} else {fprintf(stderr, HttpQueryInfo failed, error %d (0x%x)/n,GetLastError(), GetLastError());break;}}pInfoBuffer[dwInfoBufferLength] /0;pInfoBuffer[dwInfoBufferLength 1] /0;printf(%S, pInfoBuffer); //很奇怪HttpQueryInfo保存的格式是wchar_t 和下面的InternetReadFile不一样free(pInfoBuffer);//HTTP Response 的 Body, 需要的内容就在里面DWORD dwBytesAvailable;while(InternetQueryDataAvailable(hRequest, dwBytesAvailable, 0, 0)) {BYTE *pMessageBody (BYTE *)malloc(dwBytesAvailable 1);DWORD dwBytesRead;BOOL bResult InternetReadFile(hRequest, pMessageBody,dwBytesAvailable, dwBytesRead);if(!bResult) {fprintf(stderr, InternetReadFile failed, error %d (0x%x)/n,GetLastError(), GetLastError());break;}if(dwBytesRead 0)break; // End of File.pMessageBody[dwBytesRead] /0;printf(%s, pMessageBody); //InternetReadFile读出来的是普通的char. InternetReadFileEx 似乎是有宽字节版本的 ofstream out(ofs.txt);std::string s (char *)pMessageBody;out s.c_str() endl;free(pMessageBody);}getchar(); }       大家看到HttpOpenRequest这个函数中dwOpenRequestFlag参数 DWORD dwOpenRequestFlags INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |INTERNET_FLAG_KEEP_CONNECTION |INTERNET_FLAG_NO_AUTH |INTERNET_FLAG_NO_COOKIES |INTERNET_FLAG_NO_UI |//设置启用HTTPSINTERNET_FLAG_SECURE |INTERNET_FLAG_RELOAD; 要request到https网页的数据INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP和INTERNET_FLAG_SECURE两个选项要设置。   从上面的前后两段代码大家应该能看到逻辑的变化在哪里就在于HttpSendRequest这个函数的返回值的处理上。     看HttpSendRequest这层逻辑的处理你会好奇为什么要用到这样的逻辑呢答案其实并不是那么好告诉你的因为这样设置逻辑是因为微软当时在设计这个库的时候留下的一个漏洞。   因为https协议涉及到证书认证问题而IE低版本内核的浏览器打开你要请求的https Url的时候会出现证书认证失败比如我这里的btc.china.com/data/ticker而高级版本的浏览器可能就不会有任何问题。   在解决问题前我的环境是Win7系统IE10浏览器在我运行程序的时候一切正常能正常获取到程序浏览器也能打开网页看到网页上的数据但是当我把程序发布release然后交给运维测试的时候他那边环境是win server 2003 IE7环境这就出现了问题他那边获取不到那个请求https网站的数据于是我建议他们按照步骤通过浏览器端安装该网站的认证证书安装之后浏览器可以看到数据但是运行程序并不能正常获得数据这就是我的问题所在。   于是就问Google大婶们无果所以只有解铃还须系铃人了遂到微软的问题解决网站寻求帮助结果查出来这是微软设计的一个缺陷但是他们给出了很好的解决办法那就是忽略证书认证。 微软解决办法http://support.microsoft.com/kb/182888/zh-cn   考虑到有的时候有些人会打不开微软的这个网站我在这里把他复制粘贴出来如下 客户端不知道有关颁发服务器证书的证书颁发机构时就会发生此错误。通过安装证书颁发机构的根证书问题可能得到解决。可以从 Internet Explorer 查看所有已安装的证书列表。从视图菜单上单击 Internet 选项单击内容选项卡单击机构。很可能绕过此 WinInet 应用程序中的错误而不安装证书。有两种方法来处理该错误。您可以使用类似于以下示例的代码。方法 1。与用户界面 生成类似于 Internet Explorer 的消息框...Again:if (!HttpSendRequest (hReq,...))dwError GetLastError ();if (dwError ERROR_INTERNET_INVALID_CA){// Make sure to check return code from InternetErrorDlg// user may click either OK or Cancel. In case of Cancel// request should not be resumbitted.InternetErrorDlg (GetDesktopWindow(),hReq,ERROR_INTERNET_INVALID_CA,FLAGS_ERROR_UI_FILTER_FOR_ERRORS |FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,NULL);goto again;}...方法 2。而无需用户界面...Again:if (!HttpSendRequest (hReq,...))dwError GetLastError ();if (dwError ERROR_INTERNET_INVALID_CA){DWORD dwFlags;DWORD dwBuffLen sizeof(dwFlags);InternetQueryOption (hReq, INTERNET_OPTION_SECURITY_FLAGS,(LPVOID)dwFlags, dwBuffLen);dwFlags | SECURITY_FLAG_IGNORE_UNKNOWN_CA;InternetSetOption (hReq, INTERNET_OPTION_SECURITY_FLAGS,dwFlags, sizeof (dwFlags) );goto again;}...与 MFC WinInet 类可以使用相似的逻辑。在这种情况下下列 MFC 方法对应于 WinInet 上面使用的 ApiCInternetFile::SendRequest CInternetFile::QueryOption CInternetFile::SetOption CInternetFile::ErrorDlg 请注意缺少 Visual C 5.0 CInternetFile::ErrorDlgCInternetFile::QueryOption 和 CInternetFile::SetOption 上的文档。请参阅 Inet.cpp MFC 源代码文件的信息如何使用此方法。注 1 InternetErrorDlg 可能会返回下列值ERROR_SUCCESSERROR_CANCELLEDERROR_INTERNET_FORCE_RETRY.仅当返回 ERROR_INTERNET_FORCE_RETRY 时才应重新提交请求。在 Internet Explorer 4.0 和 4.01 中但是该请求必须重新提交即使 ERROR_SUCCESS 将返回。Microsoft 已经确认这是 InternetErrorDlg API 中的问题。注 2 SECURITY_FLAG_IGNORE_UNKNOWN_CA 在 Internet Explorer 3.0 和 3.02 未实现。InternetErrorDlg 仍然起作用但有以下例外。此 api 生成对话框中不允许忽略无效的证书颁发机构的错误 它是只是通知页该用户不能查看。注 3 在错误发生之前不能设置选项将忽略此错误。您首先必须尝试发送请求、 收到错误消息然后设置选项 或调用 InternetErrorDlg然后重新提交。 View Code     我用的是提供的第二个方法无用户界面的解决方法。然后这样大家应该就会明白我那里的处理逻辑为啥会那个样子了。   好了问题就是这个样子了我的问题解决了你的呢   转载于:https://www.cnblogs.com/foundwant/p/3453963.html
http://www.zqtcl.cn/news/663207/

相关文章:

  • 丹阳网站建设案例自己做个网站怎么赚钱
  • 净水机企业网站源码浏览器下载安装2022最新版
  • 高端网站建设四川网页版微信怎么下载
  • 青岛做网站皆赴青岛博采wordpress怎么改密码忘记
  • 深圳最好的网站建设广西论坛网站建设
  • html5网站设计网站建设 广西
  • 顺德手机网站设计价位网站开发学习流程图
  • 班级网站设计合肥蜀山网站开发
  • 杭州网站建设培训ck播放器整合WordPress
  • 网站建设是什么软件品牌策划公司哪家好推荐
  • 网站转跳怎么做餐饮vi设计
  • 刘连康seo培训哪家强网站优化推广平台
  • 网站推广内容滁州做网站的
  • 黄山做网站公司山东省住房和城乡建设厅举报电话
  • 中医科网站建设素材上海文明城市建设网站
  • html课程教学网站模板手机微信小程序开发教程
  • 用电脑做兼职的网站比较好食品网站建设网站定制开发
  • 网站开发 加密保护小程序制作开发进度表
  • 深圳坪山站外贸展示型网站建设
  • 手机端自定义做链接网站济南网站制作方案
  • 软件网站是怎么做的帮别人做网站赚多少钱
  • 纯静态网站 搜索功能佛山网站建设 奇锐科技
  • 四川省建设厅官方网站联系电话自己网站做虚拟币违法吗
  • 同城招聘网站自助建站2014 网站建设
  • 个人网站空间大小江油官方网站建设
  • 怎样建网站做什么网站能吸引流量
  • 做vi设计的网站网络营销推广思路
  • 简述网站设计流程沁水做网站
  • 南京公司网站建设怎么收费获奖网页设计
  • 网站域名试用期水墨风格网站源码