【wpf】06 HTTP/HTTPS请求的相关设计

在这里插入图片描述
在这里插入图片描述
这篇文章主要记录在用wpf开发应用程序从服务器端获取数据之前的准备工作。

1 HTTP标头信息

首先需要说明一下HTTP标头的信息,在使用wpf发送请求的过程中需要设置部分信息,大部分暂时用不到。

HTTP头信息

头信息由“键:值”组成。它们描述客户端或者服务器的属性、被传输的资源以及应该实现连接。

四种不同类型的头标

通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联。
请求头标:允许客户端传递关于自身的信息和希望的响应形式。
响应头标:服务器和于传递自身信息的响应。
实体头标:定义被传送资源的信息。即可用于请求,也可用于响应。

头标格式::

在Web的请求标头(Request Headers)中,有许多属性都是有用的,它们提供了关于客户端请求和期望响应的详细信息。以下是一些常见的有用请求标头属性:

User-Agent:

描述:向访问网站提供所使用的浏览器类型、操作系统及版本、CPU类型、浏览器渲染引擎、浏览器语言、浏览器插件等信息的标识。
用途:服务器可以根据User-Agent的值来判断客户端的类型和版本,从而提供合适的响应。
例如:Mozilla/5.0 (Windows NT 6.1;Win64;x64) AppleWebKit537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36

Accept:

描述:浏览器客户端用来告诉服务端能接受什么类型的响应。
用途:通过指定MIME类型(如text/html、application/json等),客户端可以告诉服务器它期望接收哪种类型的响应内容。
例如:Accept:text/html代表浏览器可以接受服务器回发html文当,如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(nonacceptable)通配符代表任意类型。如:Accept:/*代表浏览器可以处理所有类型

Accept-Encoding:

描述:浏览器客户端用来告诉服务器能接受什么编码格式,包括字符编码、压缩方式等。
用途:客户端可以告诉服务器它支持哪些压缩算法(如gzip、deflate等),以便服务器可以选择最合适的压缩方式来传输数据。
例如:Accept-Encoding:gzip,deflate

Accept-Language:

描述:浏览器客户端用来告诉服务器能接受什么语言。
用途:客户端可以指定它希望接收哪种语言的响应内容,这对于提供多语言支持的网站特别有用。
例如:Accept-Language:zh-CN,zh;q=0.9

Connection:

描述:客户端或服务端用来告诉对方当前TCP连接的状态。
用途:客户端可以告诉服务器它希望保持连接(keep-alive)还是希望每次请求后都关闭连接。
例如:Connection:close在响应结束后关闭连接

Host:

描述:指定要请求的资源所在的主机和端口。
用途:这是每个HTTP请求都必须包含的标头,它告诉服务器请求是针对哪个主机和端口的。
例如:我们在地址栏输入:http://www.baidu.com Host:www.baidu.com

Referer:

描述:浏览器客户端用来告诉服务器这个请求是从哪个页面链接过来的,即请求来源。
用途:服务器可以使用Referer标头来跟踪请求的来源,从而进行访问分析或防止恶意请求。

Cache-Control:

描述:客户端浏览器用来判断是否需要用本地缓存。
用途:客户端可以告诉服务器它是否希望使用缓存的数据,以及缓存数据的有效期等。
作用:客户端浏览器用来判断是否需要用本地缓存。默认值为private;常用值有private、no-cache、max-age、must-revalidate。具体场景举例:
a.打开新窗口时
值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值(单位为秒),那么在此值内的时间里就不会重新访问服务器,例如Cache-control:max-age=5(表示当访问此网页后的5秒内再次访问不会去服务器)
b.在地址栏回车
值为private或must-revalidate则只有第一次访问时会访问服务器,以后就不再访问。值为no-cache,那么每次都会访问。值为max-age,则在过期之前不会重复访问。
c.按后退按扭
值为private、must-revalidate、max-age,则不会重访问,值为no-cache,则每次都重复访问
d.按刷新按扭
无论为何值,都会重复访问

Cookie:

描述:客户端浏览器用来存储一些用户信息以便让服务器辨别用户身份的。
用途:服务器可以使用Cookie来跟踪用户的会话状态、存储用户偏好等。

Authorization:

描述:用于传递身份验证信息,如令牌(token)或基本身份验证的凭证。
用途:当请求需要身份验证时,客户端可以在Authorization标头中包含必要的凭证。

If-Modified-Since:

描述:把浏览器端缓存页面的最后修改时间发送到服务器去。
用途:如果资源自指定时间以来没有修改,服务器可以返回304状态码,客户端就可以直接使用本地缓存。
例如:Wed,30May201808:32:42GMT

If-None-Match:

描述:与ETag一起工作,用于判断资源是否已被修改。
用途:如果资源的ETag没有改变,服务器可以返回304状态码,客户端就可以使用本地缓存。
例如:lf-None-Match:W/“3119-1437038474000”
注意:lf-Modify-Since和lf-None-Match都可以给服务器用来判断所请求的文件距离上次访问之间是否被修改过,不过lf-Modify-Since只能精确到秒,而lf-None-Match只要文件修改过就会变化。Etag的使用场景:1.有些文件需要频繁更新,但是文件内容并没有变化。

这些请求标头属性在Web开发中非常有用,它们允许客户端和服务器之间进行更精细的交互和控制。开发者在编写网络应用程序时,需要了解这些标头的含义和用法,以便正确地设置和解析它们。

2 实现

2.1 设置标头

HttpClient 的 GetAsync 方法来发送 GET 请求,并希望设置与之前 fetch 请求中相同的请求头(除了 referrer 和 referrerPolicy,因为它们在 HttpClient 中没有直接的对应项),您可以按照以下方式修改代码:

using System;  
using System.Net.Http;  
using System.Net.Http.Headers;  
using System.Threading.Tasks;  public class ApiClient  
{  private readonly HttpClient httpClient;  private readonly string bearerToken;  public ApiClient(string token)  {  httpClient = new HttpClient();  bearerToken = token;  }  public async Task<string> GetDeptAndHospitalInfoAsync()  {  try  {  // 设置请求头  httpClient.DefaultRequestHeaders.Accept.Clear();  httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));  httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);  httpClient.DefaultRequestHeaders.Add("sec-ch-ua", "\"Chromium\";v=\"122\", \"Not(A:Brand\";v=\"24\", \"Google Chrome\";v=\"122\"");  httpClient.DefaultRequestHeaders.Add("sec-ch-ua-mobile", "?0");  httpClient.DefaultRequestHeaders.Add("sec-ch-ua-platform", "\"Windows\"");  httpClient.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue { NoCache = true };  httpClient.DefaultRequestHeaders.ConnectionClose = false; // 相当于Connection: keep-alive,但HttpClient默认就是keep-alive,所以通常不需要设置  // 注意:Cookie头通常不应该在HttpClient中手动设置,除非您正在处理特定的会话或认证需求。  // 注意:这里没有设置 Referer 头,因为 referrerPolicy 为 no-referrer  // 如果需要设置空的 Referer 头,可以取消以下行的注释  // httpClient.DefaultRequestHeaders.Referer = new Uri(""); // 但这通常不是有效的做法,因为 Uri 不能为空  // 发送 GET 请求  HttpResponseMessage response = await httpClient.GetAsync("Your rul.");  response.EnsureSuccessStatusCode();  // 读取响应内容  string content = await response.Content.ReadAsStringAsync();  return content;  }  catch (HttpRequestException e)  {  // 处理请求异常  Console.WriteLine($"Request error: {e.Message}");  throw;  }  }  
}  // 使用示例  
public class Program  
{  public static async Task Main(string[] args)  {  string bearerToken = "eyJhbGciOiJIUzUxMiJ9..."; // 您的 Bearer Token  ApiClient apiClient = new ApiClient(bearerToken);  string response = await apiClient.GetDeptAndHospitalInfoAsync();  Console.WriteLine(response);  }  
}

请注意以下几点:

  1. 使用了 httpClient.DefaultRequestHeaders 来设置全局的请求头。这些头将应用于通过此 HttpClient 实例发送的所有请求。如果您希望为单个请求设置不同的头,您可以在创建 HttpRequestMessage 时设置它们,然后使用 SendAsync 方法发送请求。但是,由于您正在发送一个简单的 GET 请求,并且所有头都是相同的,因此使用 DefaultRequestHeaders 是更简洁的方法。
  2. 取消了设置 Referer 头的代码行,因为您指定了 referrerPolicy 为 no-referrer,这意味着浏览器不会发送 Referer 头。在 HttpClient 中,如果您确实需要发送一个空的 Referer 头(尽管这通常不是有效的做法,因为 Referer 头通常包含一个有效的 URL),您可以尝试创建一个空的 Uri 对象,但这通常会导致异常。因此,我建议不要设置 Referer 头,除非服务器明确要求它。
  3. 使用了 GetAsync 方法来发送 GET 请求,并读取了响应内容。
  4. 请确保将 bearerToken 替换为您的实际令牌。在上面的代码中,我省略了令牌的一部分以保持简洁性。

2.2 获取Token令牌

在Web平台登录后,获取Authorization头的Bearer令牌的过程通常涉及与服务器进行身份验证交互。以下是获取Bearer令牌的一般步骤:

用户登录

用户在Web平台的登录页面输入用户名和密码,并提交登录请求。
后端服务器接收到登录请求后,验证用户名和密码的正确性。

令牌生成与返回

验证成功:如果用户名和密码验证成功,服务器会生成一个Bearer令牌。这个令牌是一个加密的字符串,用于在后续请求中验证用户的身份和权限。
令牌返回:服务器将生成的Bearer令牌添加到HTTP响应的头部,通常以Authorization: Bearer 的形式返回给客户端。有时,令牌也可能作为响应体的一部分返回。

客户端存储令牌

客户端接收到Bearer令牌后,需要将其存储起来,以便在后续的请求中使用。
令牌可以存储在浏览器的Cookie、LocalStorage、SessionStorage等位置,具体取决于应用的需求和安全策略。

使用Bearer令牌进行后续请求

在后续的请求中,客户端需要在HTTP请求的头部添加Authorization: Bearer ,以证明用户的身份和权限。
服务器接收到请求后,会验证请求头中的Bearer令牌是否有效。如果令牌有效,服务器会允许该请求继续执行;否则,服务器会拒绝该请求并返回相应的错误信息。

注意事项

安全性:Bearer令牌包含了用户的身份验证信息,因此必须妥善保管,避免泄露给未经授权的第三方。
有效期:Bearer令牌通常有一个有效期。在有效期内,令牌可以用于访问受保护资源。过期后,客户端需要重新进行身份验证以获取新的令牌。
令牌刷新:对于某些应用,可能提供了令牌刷新机制。当令牌即将过期时,客户端可以使用刷新令牌(Refresh Token)向服务器请求新的Bearer令牌,而无需用户重新输入用户名和密码。

示例代码

在WPF(Windows Presentation Foundation)应用程序中,我们通常不会直接处理底层的HTTP请求来获取Bearer令牌,而是会利用一些高级库或框架来简化这一过程,例如HttpClient类(.NET Framework 4.5及以上版本提供)或RestSharp等第三方库。
以下是一个使用HttpClient在WPF应用程序中发送POST请求以获取Bearer令牌的示例代码:

using System;  
using System.Net.Http;  
using System.Net.Http.Headers;  
using System.Text;  
using System.Threading.Tasks;  
using System.Windows;  namespace WpfAuthExample  
{  public partial class MainWindow : Window  {  private static readonly HttpClient client = new HttpClient();  public MainWindow()  {  InitializeComponent();  // 假设有一个按钮点击事件来获取令牌  LoginButton.Click += async (s, e) => await GetBearerTokenAsync();  }  private async Task GetBearerTokenAsync()  {  // 从UI获取用户名和密码(这里假设有TextBox控件命名为UsernameTextBox和PasswordTextBox)  string username = UsernameTextBox.Text;  string password = PasswordTextBox.Text;  // 构造登录请求的URL(替换为实际的登录URL)  string loginUrl = "https://your-auth-server.com/login";  // 构造JSON格式的登录请求体  var json = new StringContent(  $"{{\"username\": \"{username}\", \"password\": \"{password}\"}}",  Encoding.UTF8,  "application/json");  // 发送POST请求并等待响应  HttpResponseMessage response = await client.PostAsync(loginUrl, json);  // 确保响应成功  response.EnsureSuccessStatusCode();  // 读取响应内容(这里假设响应是一个JSON对象,其中包含一个名为"token"的字段)  string responseBody = await response.Content.ReadAsStringAsync();  // 实际上,你需要使用JSON解析库(如Json.NET或System.Text.Json)来解析这个JSON字符串  // 这里为了简化,我们假设已经通过某种方式获取到了token字符串  // string token = ParseTokenFromJson(responseBody); // 你需要实现这个方法  // 在这个示例中,我们直接模拟了一个token字符串  string token = "your-mocked-bearer-token";  // 在这里,你可以将token存储起来,例如在App.xaml.cs中的静态属性中,  // 或者在用户的设置中,或者在某个全局变量中,取决于你的应用架构  // App.Current.Properties["BearerToken"] = token; // 示例:存储在Application级别的属性中  // 显示token(或执行其他操作)  MessageBox.Show($"Bearer Token: {token}");  }  // 注意:你需要实现一个方法来从JSON响应中解析出token,这里为了示例直接返回了一个模拟的token  // private string ParseTokenFromJson(string jsonResponse)  // {  //     // 使用Json.NET或System.Text.Json来解析JSON并提取token字段  //     // ...  //     return "parsed-token";  // }  }  
}

注意事项:

  • 安全性:在实际应用中,不要将用户名和密码硬编码在代码中,也不要以明文形式存储或传输它们。此外,确保你的登录请求通过HTTPS发送,以保护凭证的安全。
  • 错误处理:上面的代码示例没有包含详细的错误处理逻辑。在实际应用中,你应该处理可能发生的异常,例如网络错误、身份验证失败等,并向用户显示适当的错误消息。
  • JSON解析:上面的代码示例假设你已经从响应中解析出了token,但实际上你需要使用JSON解析库(如Json.NET或System.Text.Json)来完成这一任务。
  • 令牌存储:在实际应用中,你可能需要将Bearer令牌存储在一个更安全的地方,例如使用加密的存储或安全令牌服务(STS)。
  • UI更新:上面的代码示例使用了MessageBox.Show来显示Bearer令牌,但在实际应用中,你可能需要更新UI的其他部分来反映登录状态或显示token信息。这通常涉及到数据绑定和MVVM(Model-View-ViewModel)模式等WPF核心概念。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

语音识别与语音控制

硬件平台 机器硬件&#xff1a;OriginBot(导航版/视觉版)PC主机&#xff1a;Windows&#xff08;>10&#xff09;/Ubuntu(>20.04)扩展硬件&#xff1a;X3语音版 运行案例 首先进入OriginBot主控系统&#xff0c;运行一下指令。请注意&#xff0c;部分操作OriginBot内暂…

第三课:python学习之安装pygame

首先确定自己的python已经将环境变量配置完成 第二步&#xff1a;敲击python命令看环境变量是否配置成功 第三步&#xff1a;敲击命令pip可以查看pip下有很多的命令&#xff0c;都有提示 第四步&#xff1a;我们开始安装pygame,我们使用pip install pygame命令进行安装 第五步…

【优选算法】——双指针(上篇)!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C刷题算法总结&#x1f516;克心守己&#xff0c;律己则安 目录 前言&#xff1a;双指针 1. 移动零&#xff08;easy&#xff09; 2. 复写零&#xff08;easy&#xff09; 3…

Run the FPGA VI 选项的作用

Run the FPGA VI 选项的作用是决定当主机 VI 运行时&#xff0c;FPGA VI 是否会自动运行。 具体作用&#xff1a; 勾选 “Run the FPGA VI”&#xff1a; 当主机 VI 执行时&#xff0c;如果 FPGA VI 没有正在运行&#xff0c;系统将自动启动并运行该 FPGA VI。 这可以确保 FPG…

基于SpringBoot+Vue+uniapp的个人财务系统的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

【C++进阶】set的使用

1. 序列式容器和关联式容器 前面&#xff0c;我们已经接触过STL中的部分容器如&#xff1a;string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间⼀般没有紧…

《深度学习》OpenCV LBPH算法人脸识别 原理及案例解析

目录 一、LBPH算法 1、概念 2、实现步骤 3、方法 1&#xff09;步骤1 • 缩放 • 旋转和平移 2&#xff09;步骤2 二、案例实现 1、完整代码 1&#xff09;图像内容&#xff1a; 2&#xff09;运行结果&#xff1a; 一、LBPH算法 1、概念 在OpenCV中&#xff0c;L…

【Spring AI】Java实现类似langchain的第三方函数调用_原理与详细示例

Spring AI 介绍 &#xff1a;简化Java AI开发的统一接口解决方案 在过去&#xff0c;使用Java开发AI应用时面临的主要困境是没有统一且标准的封装库&#xff0c;导致开发者需要针对不同的AI服务提供商分别学习和对接各自的API&#xff0c;这增加了开发难度与迁移成本。而Sprin…

vue elementui table编辑表单时,弹框增加编辑明细数据

需求: 前端进行新增表单时&#xff0c;同时增加表单的明细数据。明细数据部分&#xff0c;通过弹框方式增加或者编辑。 效果图&#xff1a; 代码&#xff1a; <!-- 新增主表弹窗 Begin --><el-dialog:title"titleInfo"top"5vh"centerwidth"…

软件安全漏洞挖掘: 基础知识和概念

1. 软件漏洞原理和漏洞检测方法 文章目录 1. 软件漏洞原理和漏洞检测方法1. 漏洞披露2. 漏洞定义和分类1. 漏洞的定义2. 漏洞的分类3. 漏洞检测方法常见方法1. 程序切片2. 形式化方法1. 符号执行3. 污点分析污点分析步骤/流程*污点分析流程的详细介绍1. 识别source和sink点2. 污…

SpringBoot项目:mybatis升级mybatis-plus

替换依赖修改sqlSessionFactory bean分页插件不生效问题记录 1.替换依赖&#xff1a; 将原来的mybatis整合springboot的依赖去掉&#xff0c;替换成mybatis-plus <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter…

idea2024年版本

最简单安装2024.2版本idea 内带安装教程 ** 下载链接&#xff1a;https://pan.quark.cn/s/ab24afbaa43f 提取码&#xff1a;KHrq

blender分离含有多个动作的模型,并导出含有材质的fbx模型

问题背景 笔者是模型小白&#xff0c;需要将网络上下载的fbx模型中的动作&#xff0c;分离成单独的动作模型&#xff0c;经过3天摸爬滚打&#xff0c;先后使用了blender&#xff0c;3d max&#xff0c;unity&#xff0c;最终用blender完成&#xff0c;期间参考了众多网络上大佬…

用jsp以及servlet实现获取图片验证码

jsp文件 <% page contentType"text/html;charsetUTF-8" language"java" %> <% request.setCharacterEncoding("UTF-8"); %> <% response.setCharacterEncoding("UTF-8"); %> <html> <head><title&g…

【更新】中国地区粮食播种、粮食产量、灾害等数据(1990-2023年)

数据为中国地区粮食播种、粮食产量、灾害等数据&#xff0c;包括369个指标&#xff0c;各类农作物播种面积、粮食产量、牲畜饲养、受灾面积等。这些指标综合反映了中国农业生产、粮食安全的相关情况 一、数据介绍 数据名称&#xff1a;中国地区粮食播种、粮食产量、灾害等数据…

linux 环境运行 jenkins.war包,有可能会出现字体问题,jdk版本:11 jenkins 版本:2.420

jenkins的目录&#xff1a; /usr/jenkins 启动命令 java -Djava.awt.headlesstrue sudo timedatectl set-timezone Asia/Shanghai-Xmx1024m -jar jenkins.war --httpPort8090 任意目录启动&#xff1a; nohup java -Djava.awt.headlesstrue -Xms1024m -Xmx1024m -jar /usr/j…

Spark高级用法-数据源的读取与写入

目录 数据读取 数据写入 总结 数据读取 读文件 read.json read.csv csv文件有两个部分构成 头部数据&#xff0c;也就是字段数据&#xff0c;行数数据 read.orc 读数据库 read.jdbc(jdbc连接地址,table表名,properties{user用户名,password密码,driver驱动信息}) 缺少连…

西门子变频器SINAMICS V20选型

SINAMICS V20共有五种外形尺寸可供选择&#xff0c;输出功率覆盖0.12kW-30kW&#xff1a; V20订货号 单相230V&#xff1a; 三相380V&#xff1a;

Power BI:链接数据库与动态数据展示案例

一、案例背景 在数据驱动的时代&#xff0c;如何高效、直观地展示和分析数据成为了企业决策和个人洞察的关键。Power BI作为一款强大的商业智能工具&#xff0c;凭借其强大的数据连接能力、丰富的可视化选项以及交互性和动态性&#xff0c;成为了众多企业和个人的首选。本文将…

LabVIEW如何实现高精度定时器

在LabVIEW中实现高精度定时器通常需要考虑以下几个方面&#xff1a;定时器的精度要求、操作系统的调度机制、硬件资源&#xff08;如计时器、触发器&#xff09;等。以下是几种常见的实现方式&#xff1a; ​ 1. 使用 Wait(ms) 或 Wait Until Next ms Multiple VI 这两个函数…