Winform中使用HttpClient与后端api服务进行交互
前端js可以使用ajax、axios发出http请求
在c#中winform、控制台等可以通过WebRequest、WebClient、HttpClient
有关三个类的性能对比大家可以自己搜一下,这里我主要使用和封装了HttpClient类,对于ResultDto大家可以根据所需进行修改或删除
public class HttpHelper
{
private static readonly object LockObj = new object();
private static HttpClient client = null;
private static readonly string BASE_ADDRESS = "http://localhost:1229/";
public HttpHelper()
{
GetInstance();
}
/// <summary>
/// 制造单例
/// </summary>
/// <returns></returns>
public static HttpClient GetInstance()
{
if (client == null)
{
lock (LockObj)
{
if (client == null)
{
client = new HttpClient() {
BaseAddress = new Uri(BASE_ADDRESS)
};
}
}
}
return client;
}
/// <summary>
/// 异步Post请求
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="strJson">传入的数据</param>
/// <returns></returns>
public async Task<string> PostAsync(string url,string strJson)
{
try
{
HttpContent content = new StringContent(strJson);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
HttpResponseMessage res = await client.PostAsync(url,content);
if (res.StatusCode == System.Net.HttpStatusCode.OK)
{
string resMsgStr = await res.Content.ReadAsStringAsync();
return resMsgStr;
}
else
{
return null;
}
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// 同步Post
/// </summary>
/// <param name="url"></param>
/// <param name="strJson"></param>
/// <returns></returns>
public string Post(string url, string strJson)
{
try
{
HttpContent content = new StringContent(strJson);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
//client.DefaultRequestHeaders.Connection.Add("keep-alive");
//由HttpClient发出Post请求
Task<HttpResponseMessage> res = client.PostAsync(url, content);
if (res.Result.StatusCode == System.Net.HttpStatusCode.OK)
{
string resMsgStr = res.Result.Content.ReadAsStringAsync().Result;
return resMsgStr;
}
else
{
return null;
}
}
catch (Exception ex)
{
return null;
}
}
/// <summary>
/// 异步Post请求
/// </summary>
/// <typeparam name="TResult">返回参数的数据类型</typeparam>
/// <param name="url">请求地址</param>
/// <param name="data">传入的数据</param>
/// <returns></returns>
public async Task<TResult> PostAsync<TResult>(string url, object data)
{
try
{
var jsonData = JsonConvert.SerializeObject(data);
HttpContent content = new StringContent(jsonData);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
HttpResponseMessage res = await client.PostAsync(url, content);
if (res.StatusCode == System.Net.HttpStatusCode.OK)
{
string resMsgStr = await res.Content.ReadAsStringAsync();
var result= JsonConvert.DeserializeObject<ResultDto<TResult>>(resMsgStr);
return result != null ? result.Data : default;
}
else
{
MessageBox.Show(res.StatusCode.ToString());
return default;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return default;
}
}
/// <summary>
/// 同步Get请求
/// </summary>
/// <param name="url">请求地址</param>
/// <returns></returns>
public string Get(string url)
{
try
{
var responseString = client.GetStringAsync(url);
return responseString.Result;
}
catch (Exception ex)
{
return null;
}
}
/// <summary>
/// 异步Get请求
/// </summary>
/// <param name="url">请求地址</param>
/// <returns></returns>
public async Task<string> GetAsync(string url)
{
try
{
var responseString =await client.GetStringAsync(url);
return responseString;
}
catch (Exception ex)
{
return null;
}
}
/// <summary>
/// 异步Get请求
/// </summary>
/// <typeparam name="TResult">返回参数的数据</typeparam>
/// <param name="url">请求地址</param>
/// <returns></returns>
public async Task<TResult> GetAsync<TResult>(string url)
{
try
{
var resMsgStr = await client.GetStringAsync(url);
var result = JsonConvert.DeserializeObject<ResultDto<TResult>>(resMsgStr);
return result != null ? result.Data : default;
}
catch (Exception ex)
{
return default(TResult);
}
}
}
public class ResultDto<TResult>
{
public string Msg { get; set; }
public TResult Data { get; set; }
public bool Success { get; set; }
}
}
记录我在博客园发布的第一篇文章,后续会把本人在csdn的文章都迁移过来
https://blog.csdn.net/hyx1229
Winform中使用HttpClient与后端api服务进行交互的更多相关文章
- 【API管理 APIM】APIM中对后端API服务的DNS域名缓存问题
问题描述 在使用API Management来进行API管理时,当我们后端的API DNS IP地址发生改变或者是API的域名发生改变后,通过APIM请求访问的还是是旧的域名或者IP地址,这是因API ...
- Spring Security:如何在Postman中优雅地测试后端API(前后端分离)
前言 在Postman中可以编写和执行自动化测试,使用 JavaScript 编写基本的 API 测试,自由编写任何用于自动化测试的测试方案. 在POSTMAN中读取Cookie值 1. 我们需要向& ...
- 部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用
前面介绍了很多关于ABP框架的后台Web API 服务端,以及基于Vue+Element前端应用,本篇针对两者的联合部署,以及对部署中遇到的问题进行处理.ABP框架的后端是基于.net core5.0 ...
- 使用Autofac动态注入启动Api服务
Autofac Autofac(https://autofac.org/)是一款.NET的IOC组件,它可以和Owin, Web Api, ASP.NET MVC, .NET Core完美结合,帮助开 ...
- HttpClient向后端的WebAPI工程发送HTTP的Post请求时,返回超过了最大请求长度的异常的解决方法
文章中的内容以及解决思路参考(转载)的 http://www.jb51.net/article/88698.htm 在WPF项目中通过HttpClient向后端的WebAPI工程发送HTTP的Post ...
- Web API WinForm使用HttpClient呼叫Web API
前言 之前几篇文章已经介绍了 Web 与 Web API 的使用方式,接下来将介绍如何在 Windows Form 呼叫 Web API 的方法,要在 WinForm 中使用 Web API 的话,除 ...
- 使用HttpClient对ASP.NET Web API服务实现增删改查
本篇体验使用HttpClient对ASP.NET Web API服务实现增删改查. 创建ASP.NET Web API项目 新建项目,选择"ASP.NET MVC 4 Web应用程序&quo ...
- 使用HttpClient消费ASP.NET Web API服务
本篇体验使用HttpClient消费ASP.NET Web API服务,例子比较简单. 依次点击"文件","新建","项目". 选择&quo ...
- 如何在Uniapp中访问CabloyJS后端API管理系统
介绍 CabloyJS是一款免费开源的NodeJS全栈开发框架,采用前后端分离设计,具备开箱即用的后台管理系统 Cabloy-SDK是专门为Uniapp应用量身定制的前端SDK,用于便捷的访问Cabl ...
随机推荐
- FTP 文件传输服务
昨晚心血来潮,尝试用python写了一个ftp文件传输服务,可以接收指令,从远程ftp服务器同步指定目录数据,最后没用上,开源出来. https://github.com/jadepeng/ftp_t ...
- Docker 安装 Oracle12c
为选定需要pull到系统中的数据库镜像 # docker pull sath89/oracle-12c --------sath89/oracle-12c为选定需要pull到系统中的数据库镜像 doc ...
- shell脚本 安全删除MySQL大表
一.简介 源码地址 日期:2018/4/12 介绍:工具用于安全删除MySQL表,对于一些特定场景可能有用 应用场景:大批删除不走索引但是有主键的场景[可以是单列索引,也可是多列索引] 实现思路:根据 ...
- 【死磕Java并发】—–深入分析volatile的实现原理
通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized.如果一个变量使用volatile,则它比使 ...
- TypeScript 数据类型---枚举 (Enum)
一.基础用法 1.默认值 从0开始递增+1 enum Color {Red, Green, Blue} let c: Color = Color.Red; let d: Color = Color.G ...
- ssm项目中常用的上传文件
在项目中,上传文件一般是必不可少的,所以今天学到新的上传方式,就干脆将学习过的上传方式记录一下 一.表单直接上传图片 表单头要设置 <form action="" metho ...
- CF1469D Ceil Divisions 题解
Content 你有一个长度为 \(n\) 的数组 \(a\),初始时,\(\forall i\in[1,n]\),\(a_i=i\). 每次操作选择两个数 \(x,y(1\leqslant x,y\ ...
- LuoguB2001 入门测试题目 题解
Update \(\texttt{2021.7.3}\) 经测试,本题 \(a,b\) 范围在 long long,对代码进行了修改,并修改一些笔误,更新了数据范围. \(\texttt{2021.7 ...
- java 、abstract修饰的【抽象类】【比如几何图形类】
现实中问题引入 现实中一类具有共同特征的类,但是无法具体实现.,比如我们定义了一个几何类,叫做Shape,我们有一个方法要计算周长,直接在每个子类实现虽然可以,但是无法通过Shape定义的实例来访问到 ...
- 页码pageNo与SQL的limit进行换算
/** * 计算出页码 */ public static int getPageNo(int pageNo,int pageSize){ if (pageNo<=1){ return 0; } ...