winhttp 访问https_「winhttp」C++用winhttp实现https访问服务器 – seo实验室

winhttp 访问https_「winhttp」C++用winhttp实现https访问服务器 – seo实验室winhttp由于项目升级,在数据传输过程中需要经过oauth2.0认证,访问服务器需要https协议。首先,实现C++代码访问https服务器,实现Get和post功能,在网上搜索一通,发现各种各样的都有,有的很简单,有的稍微复杂。结果MSDN介绍的比较简洁一点官方网址:https://docs.microsoft.com/en-us/windows/desktop/winhttp/ssl-i…

大家好,又见面了,我是你们的朋友全栈君。

winhttp

由于项目升级,在数据传输过程中需要经过oauth2.0认证,访问服务器需要https协议。

首先,实现C++代码访问https 服务器,实现Get和post功能,在网上搜索一通,发现各种各样的都有,有的很简单,有的稍微复杂。结果MSDN介绍的比较简洁一点

官方网址:https://docs.microsoft.com/en-us/windows/desktop/winhttp/ssl-in-winhttp

网友翻译:https://blog.csdn.net/edger2heaven/article/details/45664297

我们的要求还是相对比较简单,OAuth 采用客户端模式(client credentials)

参考阮一峰blog

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向”服务提供商”进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求”服务提供商”提供服务,其实不存在授权问题。

winhttp 访问https_「winhttp」C++用winhttp实现https访问服务器 - seo实验室

它的步骤如下:

(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。

(B)认证服务器确认无误后,向客户端提供访问令牌。

A步骤中,客户端发出的HTTP请求,包含以下参数:

granttype:表示授权类型,此处的值固定为”clientcredentials”,必选项。

scope:表示权限范围,可选项。POST /token HTTP/1.1

Host: server.example.com

authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

content-Type: APPlication/x-www-form-urlencoded

grant_type=client_credentials

认证服务器必须以某种方式,验证客户端身份。

B步骤中,认证服务器向客户端发送访问令牌,下面是一个例子。

HTTP/1.1 200 OK

Content-Type: application/json;charset=UTF-8

cache-Control: no-store

pragma: no-cache

{

“access_token”:”2YotnFZFEjr1zCsicMWpAA”,

“token_type”:”example”,

“expires_in”:3600,

“example_parameter”:”example_value”

}

以下是POST的代码,代码有点瑕疵,不能通用于普通项目,但是流程是通用的。

GET的代码也是大同小异,只是https头部信息有所不用

#include “stdafx.h”

#include “windows.h”

#include “winhttp.h”

#include “wchar.h”

#include “wincrypt.h”

#include

#pragma comment(lib, “Winhttp.lib”)

#pragma comment(lib, “Crypt32.lib”)

wstring string2wstring(const string &str)

{

_bstr_t tmp = str.c_str();

wchar_t* pwchar = (wchar_t*)tmp;

wstring ret = pwchar;

return ret;

}

void winhttp_client_post(){

LPSTR pszData = “WinHttpWriteData Example”;

Dword dwBytesWritten = 0;

BOOL bResults = FALSE;

HINTERNET hsession = NULL,

hConnect = NULL,

hrequest = NULL;

// Use WinHttpOpen to obtain a session handle.

hSession = WinHttpOpen( L”A WinHTTP Example Program/1.0″,

WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,

WINHTTP_NO_PROXY_NAME,

WINHTTP_NO_PROXY_BYPASS, 0);

// Specify an HTTP server.

if (hSession)

hConnect = WinHttpConnect( hSession, L”www.wingtiptoys.com”,

INTERNET_DEFAULT_HTTPS_PORT, 0);

// Create an HTTP Request handle.

if (hConnect)

hRequest = WinHttpOpenRequest( hConnect, L”POST”,

L”/token”,

NULL, WINHTTP_NO_referer,

WINHTTP_DEFAULT_ACCEPT_types,

0);

// Set HTTP Options

dword dwTimeOut = 3000;

DWORD dwFlags =SECURITY_FLAG_ignore_UNKNOWN_CA |

SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE |

SECURITY_FLAG_IGNORE_CERT_CN_INvalid |

SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;

BOOL bRet = WinHttpSetOption(hRequest, WINHTTP_OPTION_CONNECT_TIMEOUT, &dwTimeOut, sizeof(DWORD));

bRet = WinHttpSetOption(hRequest, WINHTTP_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));

bRet = WinHttpSetOption(hRequest, WINHTTP_OPTION_CLIENT_CERT_context, WINHTTP_NO_CLIENT_CERT_CONTEXT, 0);

//加上OAuth认证需要的header信息:

std::string client_id = “test client id”;

std::string client_secure = “test client security”;

// client id and secure need base64 encode

std::wstring strHeader = L”Content-type:application/x-www-form-urlencoded\r\n”;

strHeader += L”Authorization: Basic “;

//strHeader += string2wstring(tmsstring) +L”\r\n”; //tmsstring is client and secure after base64 encoding

bRet = WinHttpAddRequestHeader(hRequest, strHeader.c_str(), strHeader.length(), WINHTTP_ADDREQ_FLAG_ADD|WINHTTP_ADDREQ_FLAG_REPLACE);

// Send a Request.

std::string strTmp = “grant_type=client_credentials”; //OAuth认证模式是客户端模式

if (hRequest)

bResults = WinHttpSendRequest( hRequest,

WINHTTP_NO_ADDITIONAL_headers,

0, (LPVOID)strTmp.c_str(), strTmp.length(),

strTmp.length(), 0);

// Write data to the server. don’t need this step

/*if (bResults)

bResults = WinHttpWriteData( hRequest, pszData,

(DWORD)strlen(pszData),

&dwBytesWritten);

*/

// End the request.

if (bResults)

bResults = WinHttpReceiveresponse( hRequest, NULL);

// Report any ERRORs.

if (!bResults)

printf(“Error %d has occurred.\n”,GetLastError());

//接收服务器返回数据

if(bRet)

{

char *pszOutBuf;

DWORD dwSize = 0;

DWORD dwDownLoaded = 0;

std::string strJson; //返回的是Json格式

do

{

if (!WinHttpQueryDataAvailable(hRequest, &dwSize))

{

//error log

}

pszOutBuf = new char[dwSize+1];

zeromemory(pszOutBuf, dwSize+1);

if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuf, dwSize, &dwDownLoaded) )

{

//error log

}

strJson += pszOutBuf;

}while(dwSize > 0);

}

// Close any open handles.

if (hRequest) WinHttpCloseHandle(hRequest);

if (hConnect) WinHttpCloseHandle(hConnect);

if (hSession) WinHttpCloseHandle(hSession);

}

相关阅读

大家都知道Press any key to continue…,在windows下的bat中只需要一个pause命令即可,那么shell的批处理该怎样实现这个功能呢,其实

问题描述:

自己实现一个MyStrcat函数,要和C语言库函数的strcat函数完成同样的功能。

问题分析: 首先我们要了解一下strcat函数它到

示例图:activity.xml文件布局<?xml version=”1.0″ encoding=”utf-8″?>

xmlns:android=”http://schemas.android

Structured Streaming 实现思路与实现概述

[酷玩 Spark] Structured Streaming 源码解析系列 ,返回目录请 猛戳这里「腾讯·广点

实现单选功能的控件一组RadioButton必须放在一个RadioGroup中 意思就是说单选按钮中的值我们可以看作是一个数组也就是这里说的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157597.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JS设置定时器_js设置定时器

    JS设置定时器_js设置定时器JS定时器的一些特性和如何避免重复设置定时器概述和总结每个JS定时器产生时会被系统分配一个id,这个id是正整数,而且一个页面里面的定时器id不重复,我们能用一个变量接收这个id,但是如果重复执行一条接收创建语句,那么你只能接收到最新创建的定时器的id,之前创建的定时器的id会被覆盖,但是定时器数量在增加,这就会导致界面一些功能错乱,解决方法就是在重复按开始按钮时,如果已经有了一个定时器那么就不执行语句,我列出了错误代码和三种解决方法,可以解决定时器重复创建问题。ps:定时器id的配发是递增的,从1开

    2025年6月25日
    0
  • tomcat详细安装及配置教程_tomcat安装及配置

    tomcat详细安装及配置教程_tomcat安装及配置1、进入官网www.apache.org,找到Projects中的tomcat2、Download下边的版本,这里最新的是10.0x,但是一般不选最新版本,我选择的是8.5x,所以点击Download下边的Tomcat8这里我选择了64位的Windows版本,根据自己的需求下载。(建议:最好别放到C盘)下载之后解压二、配置环境1、系统变量添加:变量名:CATALINA_HOME变量值:就是你刚刚解压的那个文件夹路径2、在path中添加%CATAL…

    2022年9月19日
    0
  • 微信小程序轮播图禁止滚动

    微信小程序轮播图禁止滚动wxml<swiper-itemcatchtouchmove=’catchTouchMove’></swiper-item>jscatchTouchMove(e){returnfalse},

    2022年5月21日
    38
  • Java英文简历(java工程师求职简历)

    java工程师英文简历范文要仔细检查已成文的`个人简历,绝对不能出现错别字、语法和标点符号方面的低级错误。最好让文笔好的朋友帮你审查一遍,因为别人比你自己更容易检查出错误。java工程师英文简历范文篇一yjbysMale,20,ThecantoneseEducation:collegeWorkinglives:freshgraduatesExpectedsalary:3000-5…

    2022年4月16日
    38
  • javaweb项目部署到tomcat_idea创建tomcat项目

    javaweb项目部署到tomcat_idea创建tomcat项目提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、创建JavaWeb项目二、使用步骤三、修改默认加载界面提示:以下是本篇文章正文内容,下面案例可供参考一、创建JavaWeb项目新建一个简单的Javaweb项目,具体如下图所示tomca没有配置的话,ApplicationServer是没有默认tomcat的。这时候需要自己引入,点击输入框右边文件夹图标,找到tomcat所在文件夹位置即可(没有先下载tomcat)。完成直接Next,配置项目保存的路径后就完成了.

    2022年9月19日
    1
  • MySQL 重置 root 密码以及修改密码时报错password字段不存在

    MySQL 重置 root 密码以及修改密码时报错password字段不存在

    2022年2月18日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号