C语言使用Wininet库网络编程跳坑记 —— cookies篇

news2024/11/27 6:33:02

笔者尝试C语言使用Wininet库进行网络编程时,我尝试使用 `InternetSetCookieA()` 或 `HttpAddRequestHeadersA()` 设置 cookie。

HttpAddRequestHeadersA(Request, headers, header_len, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE);
InternetSetCookieA(url, NULL, cookie);

然而,编译后运行的结果显示返回了一组JSON信息,其中code是401,msg字符串按UTF-8编码还原为:“请登录后操作!”。似乎这两行语句并不能成功设置cookie。

 

是请求头和cookies的内容不够详细吗?

于是,我将Chrome浏览器开发者工具中的请求头内容完全复制到C语言代码的headers字符串中,并将浏览器的cookie内容复制到C代码的cookie字符串中。然后进行编译和运行...结果仍然显示相同的错误信息:请登录后操作!

令人苦恼的是,同样的请求头和cookies内容运用在 Python 代码里可以成功登录网站,在POSTMAN 里使用同样的请求头和cookies,也能返回正确的成功登录信息。为什么 C 的wininet就是不能登录?

为进行调试排查,我尝试在`HttpSendRequest()`语句之后添加`HttpQueryInfo()`进行获取headers的内容:

header_buffer_size = 4096;
char* headers_buffer = (char*)malloc(header_buffer_size);
if (HttpQueryInfo(Request, HTTP_QUERY_RAW_HEADERS_CRLF|HTTP_QUERY_FLAG_REQUEST_HEADERS, headers_buffer, &header_buffer_size, NULL)) {
    printf("发送请求后的headers内容:\n%s\n", headers_buffer);
} else {
    printf("获取headers失败!\n");
}
free(headers_buffer);

这样可以输出headers的实际内容(下图的 headers 内容照抄Chrome浏览器的请求头),可以看到服务器已返回一大串 cookies 内容。

 

我明明已设定cookies,服务器也返回 cookies 信息,令人百思不得其解的是服务器端为何不能正确处理用户登录,把wininet库的网络请求拒之门外?难道wininet库真的如此差劲?

后来在海外网寻求帮助,得悉以下几点重要信息:

1、wininet.h 库与底层操作系统紧密集成。

2、wininet 库的 cookies 管理与Windows的 Internet Explorer (IE) 浏览器共享 cookies

3、因为 wininet.h 库使用与 Internet Explorer 相同的 cookie 存储机制,允许它共享 cookie 并维护会话状态。

4、如果发送HTTP请求使用不同的库或框架,结果可能会有所不同,具体取决于它处理 cookie 和会话管理的方式。

试了一下,先使用 IE 登录网站,然后执行我的 C 代码,编译运行后显示:code: 200, msg: success,真的成功登录了!

 

然后关闭 IE,把 C 代码里所有cookies设定的语句注释掉,编译运行,仍显示成功登录!

哪尼?wininet 的 cookies 实际上是由 IE 管理的!

关于上面引用的第4点:“如果发送HTTP请求使用不同的库或框架,结果可能会有所不同,具体取决于它处理 cookie 和会话管理的方式。”,这段话意思是,可以使用其他库如大家熟知的 libcurl 发送网络请求,处理 cookie 的方式不一样。确实 libcurl 有自己的一套管理 cookies 方法,而且是跨平台的库,不需要与Windows的 IE 浏览器共享 cookies。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+Vue的电影分享平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 当代社会,…

Linux(环境准备)VMware与CentOS及XShell的安装

目录 第 1 章 VMware 1.1 VMware 安装 1.1.1 VMware Workstation Pro 15.5 安装包 ​1.2.2 欢迎界面 1.2.3 同意许可证 1.2.4 选择安装路径 1.2.5 用户体检计划 1.2.6 快捷方式 1.2.7 开始安装 1.2.8 等待安装完成 1.2.9 安装完成 1.2.10 输入许可证 1.2.11 VM…

工欲善其事,必先利其器--Vscode嵌入式Linux开发远程开发设置(适用于多平台)

点击上方“嵌入式应用研究院”,选择“置顶/星标公众号” 干货福利,第一时间送达! 来源 | 嵌入式应用研究院 整理&排版 | 嵌入式应用研究院 最近搭了一台Ubuntu18.04版本的桌面PC,不得不说比起Window搭虚拟机搞起来爽多了&…

python文件首行

类似于一切脚本文件一样,首行可用于指定解释器用于执行文件; 常见的是linux系统下的各个解释器。比如: #!/bin/sh– 使用Bourne shell或兼容的 shell执行文件,假定位于 /bin 目录中#!/bin/bash– 使用Bash shell执行文件#!/usr/…

会声会影如何抠图换背景 会声会影抠图后人物变透明

抠图换背景,大家可能会在图片编辑上应用得比较多。实际上,视频也能通过抠图的方式换背景,其困难程度与背景类型有关。纯色背景会比较简单,非纯色背景会比较难,接下来,一起来看看会声会影如何抠图换背景&…

Cocos Creator3D:制作可任意拉伸的 UI 图像

推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 制作可任意拉伸的 UI 图像 UI 系统核心的设计原则是能够自动适应各种不同的设备屏幕尺寸,因此我们在制作 UI 时需要正确设置每个控件元素的尺寸(size&#…

java项目之病人跟踪治疗信息管理系统(ssm+vue)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的病人跟踪治疗信息管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…

【C语言复习】第五篇、关于C语言变量,常量,字符串,转义字符的知识

目录 第一部分、关于变量 1、什么是变量?变量的分类? 2、变量的作用域?变量的生命周期? 第二部分、关于常量 1、什么是常量? 2、如何定义常量? 第三部分、关于字符串 1、什么是字符串? …

2023年春季学期NLP总结作业

自然语言处理(Natural Language Processing,NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域。自然语言处理是计算机科学领域与人工智能领域中的一个重要方向…

【网络原理】TCP连接管理机制(三次握手四次挥手)

🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者。 🤼专栏收录于:计算机网络原理 在使用TCP协议进行网络交互时,TCP会进行三次握手即建立连接,TCP四次挥手…

Stable Diffusion局部重绘功能,如何完美抹掉不想要的物体?

网上一堆文生图教程,这种抽卡式东西玩几天就没有意思了,怎么按照自己的意愿生成自己的图是非常有意思的东西,所以我对局部重绘特别感兴趣,借助 SD 的扩散算法,如何利用它的扩散算法来向着自己期望的方向上呈现&#xf…

分享5款十分小众的软件,不好用你找我

今天推荐5款十分小众的软件,但是每个都是非常非常好用的,用完后觉得不好用你找我。 网络测速——NetSpeedMonitor NetSpeedMonitor是一款用于测量和显示你的网络速度的工具。它可以让你在任务栏上看到你的实时上传和下载速度,并提供多种功能…

Win10任务栏一直转圈圈不能操作怎么办?

Win10任务栏一直转圈圈不能操作怎么办?Win10电脑用户遇到了任务栏一直转圈圈不能操作的问题,不知道怎么操作才能解决,这时候用户可以打开桌面上的控制面板,点击卸载更新补丁,也可以通过打开命令提示符窗口,…

【业务功能篇30】代码重构--卫语句/idea内置工具抽象方法

业务场景: 当前我们项目在发布流水线的时候,codecheck 圈复杂度高于10的,或者14的,需要进行一些整改, 什么是圈复杂度? 圈复杂度(Cyclomatic complexity,CC)也称为条件复…

【Leetcode60天带刷】day07哈希表——454.四数相加II , 383. 赎金信 ,15. 三数之和 , 18. 四数之和

题目&#xff1a;454.四数相加II 454. 四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 …

进阶面向对象

面向对象的意义在于 将日常生活中习惯的思维方式引入程序设计中 将需求中的概念直观的映射到解决方案中 以模块为中心构建可复用的软件系统 提高软件产品的可维护性和可拓展性 类和对象是面向对象中的两个基本概念 类&#xff1a;指的是一类事务&#xff0c;是一个抽象的概…

【Python 随练】学生成绩等级划分

题目&#xff1a; 利用条件运算符的嵌套来完成此题&#xff1a;学习成绩 ≥ 90 分的同学用 A 表示&#xff0c;60-89 分之间的用 B 表示&#xff0c;60 分以下的用 C 表示。 简介&#xff1a; 在本篇博客中&#xff0c;我们将使用条件运算符的嵌套来划分学生成绩的等级。根据…

Redis安装说明(黑马程序员)

Redis安装说明&#xff08;黑马程序员&#xff09; 笔者的redis(Linux版)的下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87926624 笔者的redis图形化桌面客户端&#xff0c;下载链接地址为&#xff1a;https://download.csdn.net/download/w…

朴素贝叶斯算法

文章目录 1. 贝叶斯定理2. 朴素贝叶斯2.1 朴素贝叶斯原理2.2 朴素贝叶斯适用范围2.3 朴素贝叶斯常用模型 3. 朴素贝叶斯算法的特点4. 朴素贝叶斯的Python应用5. 源码仓库地址 1. 贝叶斯定理 先验概率&#xff1a;即基于统计的概率&#xff0c;是基于以往历史经验和分析得到的结…

【事故致因】HFACS(人因分析与分类系统)

HFACS&#xff08;人因分析与分类系统&#xff09; 1 来源2 拟解决的问题&#xff08;背景&#xff09;2 基本架构2.1 Unsafe Acts2.1.1 Errors2.1.1.1 Skill-based errors2.1.1.2 Decision errors2.2.1.3 Perceptual errors 2.1.2 Violations2.1.2.1 Routine violations2.1.2.…