Httphelper: Http请求webapi小记

文章目录

  • [1、HttpHelper.cs Framework4.81](#1、HttpHelper.cs Framework4.81)
  • [2、HttpHelper.cs NET8](#2、HttpHelper.cs NET8)
  • [3、JsonHelper.cs Framework4.81](#3、JsonHelper.cs Framework4.81)
  • [4、JsonHelper.cs NET8](#4、JsonHelper.cs NET8)
  • [5、uniapp request.js 访问WEBAPI](#5、uniapp request.js 访问WEBAPI)

每次查找、测试都比较费事,记录一下把

1、HttpHelper.cs Framework4.81

csharp 复制代码
using System;
using System.IO;
using System.Net;
using System.Text;
namespace ClassLibrary
{
    public static class HttpHelper
    {
        public static string ApiUrl = "http://localhost:6666/api/Data/";
        /// <summary>
        /// 执行HTTP GET请求。
        /// </summary>
        /// <param name="url">目标URL。</param>
        /// <param name="timeoutMilliseconds">请求超时时间(毫秒)。</param>
        /// <param name="proxy">可选参数:指定代理服务器地址。</param>
        /// <returns>返回响应的内容作为字符串。</returns>
        public static string Get(string Method, int timeoutMilliseconds = 10000, IWebProxy proxy = null)
        {
            try
            {
                string url = ApiUrl + Method;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "GET";
                request.Timeout = timeoutMilliseconds;

                if (proxy != null)
                {
                    request.Proxy = proxy;
                }

                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
                {
                    return reader.ReadToEnd();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 执行HTTP POST请求。
        /// </summary>
        /// <param name="url">目标URL。</param>
        /// <param name="postData">POST数据(通常为JSON或表单编码的数据)。</param>
        /// <param name="contentType">内容类型,默认为"application/json"。</param>
        /// <param name="timeoutMilliseconds">请求超时时间(毫秒)。</param>
        /// <param name="proxy">可选参数:指定代理服务器地址。</param>
        /// <returns>返回响应的内容作为字符串。</returns>
        public static string Post(string Method, string postData, int timeoutMilliseconds = 10000, IWebProxy proxy = null)
        {
            try
            {
                string url = ApiUrl + Method;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "POST";
                request.ContentType = "application/json";
                request.ContentLength = Encoding.UTF8.GetByteCount(postData);
                request.Timeout = timeoutMilliseconds;

                if (proxy != null)
                {
                    request.Proxy = proxy;
                }
                using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
                {
                    writer.Write(postData);  
                }

                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                {
                    return reader.ReadToEnd();           // 返回服务器响应内容
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

    }
}

调用读取示例

csharp 复制代码
//传输model
  public class DataReq
  {
       public  string Data { get; set; }
       public string DBstr { get; set; }
  }
  public class object1
 {
	   public string str { get; set; }
 }
 /* public class object2
 {
     public string ID { get; set; }
     public string Name{ get; set; }
 }
  */
  //客户端发送请求
 public void testpost(){
	 DataReq r = new DataReq();
	 r.Data = "[{\"str\":\"321\"},{\"str\":\"\"}]";
	 r.DBstr = "123";
	   //"{\"DBstr\":\"321\",\"Data\":\"\"}"
	 string postData= JsonHelper.Serialize(r);
	 string method = "GetTest";
	 string rst = HttpHelper.Post(method, postData);
 }
 
 //webapi接受请求
  [Route("api/[controller]/[action]")]
 [ApiController]
 public class DataController : ControllerBase
 {
	  [HttpPost]
	 public async Task<IActionResult> GetTest(DataReq obj)
	 {
	   List<object1> LIST = new List<object1>();
	  if (!String.IsNullOrEmpty(obj.Data))
	   LIST = JsonHelper.ToObj<List<object1>>(obj.Data);//解析数据
       //省略逻辑
       DataTable dt = ;//查询
       if (dt.Rows.Count == 0) return Ok("no");
       string JsonStr = JsonHelper.ToStr(dt);
	   return Ok(JsonStr);
	 }
 }

2、HttpHelper.cs NET8

csharp 复制代码
using System.Net;
using System.Text;
using System.Text.Json;

/// <summary>
/// http帮助类
/// </summary>
public class HttpHelper
{
    private readonly HttpClient _httpClient;
    private readonly ILogger<HttpHelper>? _logger;
    public static string  WebServiceUrl="";
    //WebServiceUrl=http://localhost:6666/api/Data/
    // 支持依赖注入的构造函数
    public HttpHelper(HttpClient httpClient, ILogger<HttpHelper>? logger = null)
    {
        _httpClient = httpClient;
        _logger = logger;
        _httpClient.Timeout = TimeSpan.FromSeconds(30);
    }

    // 同步GET请求
    public HttpResponseEntity Get(string url, string traceId = "")
    {
        return GetAsync(url, traceId).GetAwaiter().GetResult();
    }

    // 异步GET请求
    public async Task<HttpResponseEntity> GetAsync(string url, string traceId = "")
    {
        try
        {
            using var response = await _httpClient.GetAsync(url);
            var content = await response.Content.ReadAsStringAsync();

            _logger?.LogInformation("[{TraceId}] GET {Url} - Status:{StatusCode}",
                traceId, url, response.StatusCode);

            return new HttpResponseEntity
            {
                IsSuccess = response.IsSuccessStatusCode,
                StatusCode = response.StatusCode,
                Content = content,
                TraceId = traceId
            };
        }
        catch (Exception ex)
        {
            _logger?.LogError(ex, "[{TraceId}] GET {Url} failed", traceId, url);
            return new HttpResponseEntity
            {
                IsSuccess = false,
                ErrorMessage = ex.Message,
                TraceId = traceId
            };
        }
    }

    // 同步POST请求(支持JSON)
    public HttpResponseEntity Post(string url, string data, string traceId = "")
    {
        string NowUrl= WebServiceUrl+ url;
        return PostAsync(NowUrl, data, traceId).GetAwaiter().GetResult();
    }

    // 异步POST请求
    public async Task<HttpResponseEntity> PostAsync(string url, string data, string traceId = "")
    {
        try
        {
            var content = new StringContent(_data, Encoding.UTF8, "application/json");
            using var response = await _httpClient.PostAsync(url, content);
            var responseContent = await response.Content.ReadAsStringAsync();

            _logger?.LogInformation("[{TraceId}] POST {Url} - Status:{StatusCode}",
                traceId, url, response.StatusCode);

            return new HttpResponseEntity
            {
                IsSuccess = response.IsSuccessStatusCode,
                StatusCode = response.StatusCode,
                Content = responseContent,
                TraceId = traceId
            };
        }
        catch (Exception ex)
        {
            _logger?.LogError(ex, "[{TraceId}] POST {Url} failed", traceId, url);
            return new HttpResponseEntity
            {
                IsSuccess = false,
                ErrorMessage = ex.Message,
                TraceId = traceId
            };
        }
    }
}

public class HttpResponseEntity
{
    public bool IsSuccess { get; set; }
    public HttpStatusCode StatusCode { get; set; }
    public string? Content { get; set; }
    public string? ErrorMessage { get; set; }
    public string? TraceId { get; set; }
}

调用读取示例

csharp 复制代码
//传输model
public class DataReq
  {
       public  string Data { get; set; }
       public string DBstr { get; set; }
  }
  public class object1
 {
	   public string str { get; set; }
 }
//请求
public void testpost(){
    DataReq r = new DataReq();
	 r.Data = "[{\"str\":\"321\"},{\"str\":\"\"}]";
	 r.DBstr = "123";
	   //"{\"DBstr\":\"321\",\"Data\":\"\"}"
	 string postData= JsonHelper.Serialize(r);
	 string method = "GetTest";
	 
	// 注册服务(控制台程序需手动创建)
	var services = new ServiceCollection();
	services.AddHttpClient<HttpHelper>();
	var provider = services.BuildServiceProvider();
	// 获取实例
	var httpHelper = provider.GetRequiredService<HttpHelper>();
	
	// 发送POST请求
	var postResponse = httpHelper.Post(method , postData, "TRACE456");
	if (postResponse.IsSuccess)
	    return Ok("true");
	else
	    return Ok("false");
}
 //webapi接受请求
  [Route("api/[controller]/[action]")]
 [ApiController]
 public class DataController : ControllerBase
 {
	  [HttpPost]
	 public async Task<IActionResult> GetTest(DataReq obj)
	 {
	   List<object1> LIST = new List<object1>();
	  if (!String.IsNullOrEmpty(obj.Data))
	   LIST = JsonHelper.ToObj<List<object1>>(obj.Data);//解析数据
      string DBstr=obj.DBstr;
      //省略逻辑
       DataTable dt = ;//查询
       if (dt.Rows.Count == 0) return Ok("no");
       string JsonStr = JsonHelper.ToStr(dt);
	   return Ok(JsonStr);
	 }
 }

3、JsonHelper.cs Framework4.81

使用自带System.Runtime.Serialization.Json;

csharp 复制代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
namespace ClassLibrary
{
    public static class JsonHelper
    {
        /// <summary>
        /// object =>JSON
        /// </summary>
        public static string Serialize<T>(T obj)
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            using (MemoryStream stream = new MemoryStream())
            {
                serializer.WriteObject(stream, obj);
                return Encoding.UTF8.GetString(stream.ToArray());
            }
        }

        /// <summary>
        /// JSON=> object
        /// </summary>
        public static T Deserialize<T>(string jsonString)
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
            {
                return (T)serializer.ReadObject(stream);
            }
        }

        /// <summary>
        /// List<object> =>JSON 
        /// </summary>
        public static string SerializeToJson(List<object> list)
        {
            var serializer = new DataContractJsonSerializer(list.GetType());

            using (var memoryStream = new MemoryStream())
            {
                serializer.WriteObject(memoryStream, list);
                memoryStream.Position = 0;

                using (var streamReader = new StreamReader(memoryStream))
                {
                    return streamReader.ReadToEnd();
                }
            }
        }

        /// <summary>
        /// JSON=> List<object>
        /// </summary>
        public static List<T> DeserializeFromJson<T>(string jsonString) where T : class
        {
            var serializer = new DataContractJsonSerializer(typeof(List<T>));

            using (var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
            {
                return (List<T>)serializer.ReadObject(memoryStream);
            }
        }
    }
}

补充:

使用自带的System.Web.Script.Serialization; 完成DataTable和JSON互换。

csharp 复制代码
using System.Web.Script.Serialization;


 /// <summary>
 /// 将 DataTable 序列化成 json 字符串
 /// </summary>
 /// <param name="dt">DataTable对象</param>
 /// <returns>json 字符串</returns>
 public static string DataTableToJson(DataTable dt)
 {
     if (dt == null || dt.Rows.Count == 0)
     {
         return "\"\"";
     }
     JavaScriptSerializer myJson = new JavaScriptSerializer();
     myJson.MaxJsonLength = Int32.MaxValue;
     List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
     foreach (DataRow dr in dt.Rows)
     {
         Dictionary<string, object> result = new Dictionary<string, object>();
         foreach (DataColumn dc in dt.Columns)
         {
             result.Add(dc.ColumnName, dr[dc].ToString());
         }
         list.Add(result);
     }
     return myJson.Serialize(list);
 }
 /// <summary>
 /// 将 json字符串 反序列化成DataTable
 /// </summary>
 public static DataTable JsonToDataTable(string jsonString)
 {
     JavaScriptSerializer serializer = new JavaScriptSerializer();
     List<Dictionary<string, object>> list = serializer.Deserialize<List<Dictionary<string, object>>>(jsonString);
     DataTable dataTable = new DataTable();
     if (list.Count > 0)
     {
         foreach (var key in list[0].Keys)
         {
             dataTable.Columns.Add(key);
         }
         foreach (var row in list)
         {
             DataRow dataRow = dataTable.NewRow();
             foreach (var kvp in row)
             {
                 dataRow[kvp.Key] = kvp.Value ?? DBNull.Value;
             }
             dataTable.Rows.Add(dataRow);
         }
     }

     return dataTable;
 }
 /*
/// <summary>
 /// 将 json 字符串反序列化成对象
 /// </summary>
 /// <typeparam name="T">对象类型</typeparam>
 /// <param name="json">json字符串</param>
 /// <returns>对象实例</returns>
 public static T JsonToObject<T>(string json)
 {
     if (string.IsNullOrEmpty(json))
     {
         return default(T);
     }
     JavaScriptSerializer myJson = new JavaScriptSerializer();
     return myJson.Deserialize<T>(json);
 }
 /// <summary>
 /// 将 json 字符串反序列化成对象
 /// </summary>
 /// <param name="json">json字符串</param>
 /// <returns>对象实例</returns>
 public static object JsonToObject(string json)
 {
     if (string.IsNullOrEmpty(json))
     {
         return null;
     }
     JavaScriptSerializer myJson = new JavaScriptSerializer();
     return myJson.DeserializeObject(json);
 }
*/

4、JsonHelper.cs NET8

nuget Newtonsoft.Json 包

csharp 复制代码
using Newtonsoft.Json;
using System.IO;
namespace ClassLibrary
{
    public static class JsonHelper
    {
        // 将对象序列化为JSON字符串
        public static string ToStr(object obj)
        {
            return JsonConvert.SerializeObject(obj);
        }

        // 将JSON字符串反序列化为指定类型的对象
        public static T ToObj<T>(string json)
        {
            return JsonConvert.DeserializeObject<T>(json);
        }

        // 将对象序列化到文件
        public static void SerializeToFile(string filePath, object obj)
        {
            string json = ToStr(obj);
            File.WriteAllText(filePath, json);
        }

        // 从文件读取JSON并反序列化为指定类型的对象
        public static T DeserializeFromFile<T>(string filePath)
        {
            string json = File.ReadAllText(filePath);
            return ToObj<T>(json);
        }
    }
}

5、uniapp request.js 访问WEBAPI

VUE2/3 通用

csharp 复制代码
/*request重写
调用示例
let obj={};
obj.Data = "[{\"str\":\"321\"},{\"str\":\"\"}]";
obj.DBstr = "123";
const params = {
		"object": "Data",//指向DataController 
		"method": "GetTest",//指向方法
		"data": JSON.stringify(obj),
		}
		this.$request({
			data: params
		}).then((res) => {
			if (res.data == false) {
				
			} else {
				
			}
		}, err => {
			this.$mHelper.toast('请求失败');
		})
	}
	*/
import indexConfig from '@/common/config.js';
import assist from '@/common/assist.js';
const PATH = indexConfig.dataUrl;
//PATH= http://localhost:6666/api/
const request = (options) => {
	let url=PATH+'/'+options.data.object+'/'+options.data.method
	options=options.data;
	
	uni.showLoading({
		title: '加载中'
	});
	options.url=url;
	options.method= 'POST';
	options.header = {'content-type': 'application/json','authorization':'Bearer '+assist.gdata("Token")}
    return new Promise((resolve,reject) => {
        console.log(JSON.stringify(options));
        uni.request({
            ...options,
            success: (res) => {
                console.log(res);
				console.log(res.statusCode);
                if(res.statusCode == '403') {
                    // 登录过期跳转到登录界面
                    uni.showToast({
                        title: '超时,请稍后再试!',
                        icon: 'none'
                    });
                    // logOut()
                }
                if(res.statusCode == '-1') {
                    uni.showToast({
                        title: res.data.msg ? res.data.msg : '接口请求失败!',
                        icon: 'none'
                    });
                }
				uni.hideLoading();
                resolve(res);
				
            },
            fail: (err) => {
                console.log(err);
                console.log(options);
				uni.hideLoading();
                reject(err)
            },
			
        })
    })
}
export default request

缓存 assist.js

csharp 复制代码
/*缓存写入*/
const expire=3600//1小时
function  setCache(key, value, expire) {
	let obj = {
		data: value,
		time: Date.now()/1000,
		expire: expire
	}
	uni.setStorageSync(key, JSON.stringify(obj));
}
/*缓存读取*/
function  getCache(key, value, expire) {
	let val = uni.getStorageSync(key);
	if (!val) return null;
	let obj = JSON.parse(val);
	if (Date.now() / 1000 - obj.time > obj.expire)//过期
	{
		uni.removeStorageSync(key);
		return null;
	}
	return obj.data;
}
export default {
	sdata:setCache,
	gdata:getCache,
}

main.js 全局申明

vue3

csharp 复制代码
import $assist from '@/common/assist.js';//辅助函数
import $request from '@/common/request.js';//POST 重构
export function createApp() {
	const app = createSSRApp(App)
	app.use(store)
	//自定义配置 调用
	app.config.globalProperties.$assist = $assist;
	app.config.globalProperties.$request = $request;
	//-end
	
	return {
		app
	}
}
/*vue2 申明方法
 import Vue from 'vue'
//自定义
Vue.prototype.$assist= $assist;
Vue.prototype.$request = $request;
*/
相关推荐
傻啦嘿哟7 分钟前
HTTP/HTTPS与SOCKS5协议在隧道代理中的兼容性设计解析
网络协议·http·https
会飞的架狗师10 分钟前
【HTTP】connectionRequestTimeout与connectTimeout的本质区别
网络·网络协议·http
陳長生.21 分钟前
JAVA EE_HTTP
网络·网络协议·http
wzw_______2 小时前
BGP local preference选路 AS-Path
网络
zdd567892 小时前
网络学习中通信方面的相关知识、及再次解读B=2W
网络·信息与通信
Endeavors_YT3 小时前
计算机网络基础概念
服务器·网络·计算机网络
搬码临时工3 小时前
本地ip如何映射到外网?借助端口映射软件把内网地址给别人用
运维·服务器·网络·tcp/ip·智能路由器·远程工作·访问者模式
WuYiCheng6663 小时前
人性的裂痕:社会工程学如何成为网络安全的隐形战场
网络·安全·web安全
听风说雨的人儿4 小时前
WebSocket解决方案的一些细节阐述
网络·websocket·网络协议
群联云防护小杜4 小时前
企业级物理服务器选型指南 - 网络架构优化篇
服务器·网络·架构