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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 玩转ADB命令(ADB命令使用大全)

    玩转ADB命令(ADB命令使用大全)我相信做Android开发的朋友都用过ADB命令,但是也只是限于安装应用push文件和设备重启相关,根深的也不知道了,其实我们完全可以了解多一点,有一些不常用的场景我们至少应该知道它可以做到,比如,我们知道adbinstall却不知道adbshellamstart。前者是用来安装软件,后者用来打开软件,后者的一个使用场景让我对他重视:公司定制Android系统,在调试屏幕的时候要看是否满屏

    2022年5月13日
    37
  • 离心泵CAE_2_ICEM剖分网格_2_叶轮流道[通俗易懂]

    离心泵CAE_2_ICEM剖分网格_2_叶轮流道[通俗易懂]针对本科毕设中所涉及到的离心泵数值分析和性能计算,将用最简单粗暴的方法,讲解如何基于CFturbo、ICEM、FLUENT来开展离心泵水力设计和性能分析的计算机辅助(CAE)实现。离心泵的水力设计由CFturbo软件实现;网格剖分由ICEM软件实现;CFD数值计算由FLUENT软件实现;并验证设计值是否达到。这里是第二部分,ICEM软件实现离心泵过流通道的网格剖分,含叶轮流道、进口延伸段、蜗壳流道的网格剖分。由于三个流道分开来划分网格,所以分三部分来分别讲解,这里是第2篇,叶轮流道的网格剖分……

    2022年5月26日
    47
  • c语言删除数组中重复元素

    c语言删除数组中重复元素原题:把一个数组中的重复元素去掉。如a[12]={1,1,2,7,3,2,3,4,5,8,7,4},输出为:1,2,7,3,4,5,8在csdn上查了一下,发现给出的方法都很复杂,对新手很不友好,于是写了一个比较简单的,源码如下:#include<stdio.h>#defineN12intmain(){inti,j,n=N,k;intnum[N]…

    2022年7月11日
    24
  • Java笔记-使用Kaptcha验证码框架

    Java笔记-使用Kaptcha验证码框架使用Kaptcha这个验证码框架用起来,比自己写简单首先设置maven项目:<dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId>…

    2022年6月18日
    36
  • MySQL数据库使用命令行备份|MySQL数据库备份命令

    MySQL数据库使用命令行备份|MySQL数据库备份命令转至  神马和浮云 ,命令未测试,主要是方便操作mysql时需要而记的笔记  例如:数据库地址:127.0.0.1数据库用户名:root数据库密码:pass数据库名称:myweb 备份数据库到D盘跟目录mysqldump-h127.0.0.1-uroot-ppassmyweb&gt;d:/backupfile.sql备份到当前目录备份MySQ…

    2022年6月10日
    34
  • phpstorm激活码2021 64位_通用破解码

    phpstorm激活码2021 64位_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    220

发表回复

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

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