三种方式在ASP.NET Core中实现代理功能请求获取数据的接口(以请求百度统计数据接口为例)

一、定义请求数据属性

TargetUrl参数是目标接口的URL,RequestDataArray参数是要发送的请求数据列表
c 复制代码
 //定义属性:TargetUrl参数是目标接口的URL,RequestDataArray参数是要发送的请求数据列表
 public class ToResponseBody
 {
     [JsonPropertyName("TargetUrl")]
     public string TargetUrl { get; set; } = "";
     [JsonPropertyName("RequestDataArray")]
     public string[] RequestDataArray { get; set; } = null;
 }

二、定义api返回数据内容形式

c 复制代码
  public class ApiReturnData
  {
      public int code { get; set; } = 0;
      public string msg { get; set; } = "";
      public dynamic data { get; set; } = new ExpandoObject();
  }

三、百度统计api简介:

(1)大家首先进入以下网址:这个网址介绍了 用户如果要调用百度账号的 API 接口,需要通过百度开发者中心的身份验证,具体步骤进入网址中查看(里面介绍得非常详细):

c 复制代码
 地址:https://tongji.baidu.com/api/manual/Chapter2/openapi.html

(2)接着再进入接口网址:

c 复制代码
 地址:https://tongji.baidu.com/api/manual/Chapter1/overview_getTimeTrendRpt.html

其中里面有很多接口:

以其中 【网站概况(趋势数据)】为例:里面包含请求的关键参数与接口地址

以上就是一个基本介绍,详细内容大家可以在官网里面仔细查看!

四、实现方法:

方法一:使用HttpClient类:HttpClient类是一个强大的HTTP客户端,可以用于发送HTTP请求并接收响应。您可以使用它来实现代理功能,发送请求到目标接口并返回响应。(代码中有注释,大家可以参考)
c 复制代码
[AllowAnonymous]
[HttpPost("GetResponseBody")]
         public async ValueTask<ApiReturnData> GetResponseBody([FromBody] ToResponseBody request) 
        {
            //使用HttpClient类:HttpClient类是一个强大的HTTP客户端,可以用于发送HTTP请求并接收响应。您可以使用它来实现代理功能,发送请求到目标接口并返回响应。
            //代码中的targetUrl参数是目标接口的URL,requestData参数是要发送的请求数据
            try
            {
                using (HttpClient client = new HttpClient())
                {
                    // 创建HttpRequestMessage对象,设置HTTP方法和请求内容
                    HttpRequestMessage requests = new HttpRequestMessage(HttpMethod.Post, request.TargetUrl);
                    /*
                    foreach (string element in request.RequestDataArray)
                    {
                        Console.WriteLine(element);
                    }*/
                    string metrics = "";
                    // 将请求的metrics参数进行拼接
                    for (int i = 4;i< request.RequestDataArray.Length; i++)
                    {
                        metrics =request.RequestDataArray[i] + "," + metrics;
                    }
                    string reqdata = String.Format("&site_id={0}&method={1}&start_date={2}&end_date={3}&metrics={4}", request.RequestDataArray[0], request.RequestDataArray[1], request.RequestDataArray[2], request.RequestDataArray[3], metrics);
                    requests.Content = new StringContent(reqdata, System.Text.Encoding.UTF8, "application/json");
                    // 发送HTTP请求并获取响应
                    HttpResponseMessage response = await client.SendAsync(requests);
                    // 确保请求成功
                    response.EnsureSuccessStatusCode();
                    // 读取响应内容
                    string responseData = await response.Content.ReadAsStringAsync();
                    // 创建返回数据对象rt
                    ApiReturnData rt = new ApiReturnData();
                    rt.code = 0;
                    rt.msg = "";
                    rt.data.ResponseBody = responseData;
                    return rt;
                }
            }
            catch (Exception ex)
            {
                ApiReturnData rt = new ApiReturnData();
                rt.code = 0;
                rt.msg = "";
                rt.data.ResponseBody = ex.Message;
                return rt;
            }
        }

结果如下:

参数输入

得到的数据:

方法二:使用WebClient类:WebClient类是一个简单的HTTP客户端,可以用于发送HTTP请求并接收响应。您可以使用它来实现代理功能,发送请求到目标接口并返回响应。
c 复制代码
[AllowAnonymous]
[HttpPost("GetResponseBody1")]
public async ValueTask<ApiReturnData> GetResponseBody1([FromBody] ToResponseBody request)
{
    try
    {
        using (WebClient client = new WebClient())
        {
            // 设置请求头
            client.Headers[HttpRequestHeader.ContentType] = "application/json";

            string metrics = "";
            // 将请求的metrics参数进行拼接
            for (int i = 4; i < request.RequestDataArray.Length; i++)
            {
                metrics = request.RequestDataArray[i] + "," + metrics;
            }
            string reqdata = String.Format("&site_id={0}&method={1}&start_date={2}&end_date={3}&metrics={4}", request.RequestDataArray[0], request.RequestDataArray[1], request.RequestDataArray[2], request.RequestDataArray[3], metrics);
            // 发送HTTP请求并获取响应
            string responseData = await client.UploadStringTaskAsync(request.TargetUrl, "POST", reqdata);
            ApiReturnData rt = new ApiReturnData();
            rt.code = 0;
            rt.msg = "";
            rt.data.ResponseBody = responseData;
            return rt;
        }
    }
    catch (Exception ex)
    {
        ApiReturnData rt = new ApiReturnData();
        rt.code = 0;
        rt.msg = "";
        rt.data.ResponseBody = ex.Message;
        return rt;
    }
}

结果如下:

方法三:使用HttpWebRequest类:HttpWebRequest类是一个更底层的HTTP客户端,可以用于发送HTTP请求并接收响应。您可以使用它来实现代理功能,发送请求到目标接口并返回响应。
c 复制代码
      [AllowAnonymous]
      [HttpPost("GetResponseBody2")]
      public async ValueTask<ApiReturnData> GetResponseBody2([FromBody] ToResponseBody request)
      {
          try
          {
              // 创建HttpWebRequest对象
              HttpWebRequest requests = (HttpWebRequest)WebRequest.Create(request.TargetUrl);
              requests.Method = "POST";
              requests.ContentType = "application/json";

              string metrics = "";
              // 将请求的metrics参数进行拼接
              for (int i = 4; i < request.RequestDataArray.Length; i++)
              {
                  metrics = request.RequestDataArray[i] + "," + metrics;
              }
              string reqdata = String.Format("&site_id={0}&method={1}&start_date={2}&end_date={3}&metrics={4}", request.RequestDataArray[0], request.RequestDataArray[1], request.RequestDataArray[2], request.RequestDataArray[3], metrics);

              // 将请求内容写入请求流
              using (StreamWriter writer = new StreamWriter(requests.GetRequestStream()))
              {
                  writer.Write(reqdata);
              }

              // 发送HTTP请求并获取响应
              using (HttpWebResponse response = (HttpWebResponse)await requests.GetResponseAsync())
              {
                  // 读取响应流
                  using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
                  {
                      string responseData = await reader.ReadToEndAsync();
                      ApiReturnData rt = new ApiReturnData();
                      rt.code = 0;
                      rt.msg = "";
                      rt.data.ResponseBody = responseData;
                      return rt;
                  }
              }
          }
          catch (Exception ex)
          {
              ApiReturnData rt = new ApiReturnData();
              rt.code = 0;
              rt.msg = "";
              rt.data.ResponseBody = ex.Message;
              return rt;
          }

      }

结果如下:

以上就是本节的一个简单介绍,大家可以借鉴参考一下,有什么不足的地方大家指出一下!

相关推荐
代码小鑫6 分钟前
A031-基于SpringBoot的健身房管理系统设计与实现
java·开发语言·数据库·spring boot·后端
Json____11 分钟前
学法减分交管12123模拟练习小程序源码前端和后端和搭建教程
前端·后端·学习·小程序·uni-app·学法减分·驾考题库
monkey_meng31 分钟前
【Rust类型驱动开发 Type Driven Development】
开发语言·后端·rust
落落落sss39 分钟前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby
大鲤余1 小时前
Rust,删除cargo安装的可执行文件
开发语言·后端·rust
她说彩礼65万1 小时前
Asp.NET Core Mvc中一个视图怎么设置多个强数据类型
后端·asp.net·mvc
陈随易1 小时前
农村程序员-关于小孩教育的思考
前端·后端·程序员
_江南一点雨1 小时前
SpringBoot 3.3.5 试用CRaC,启动速度提升3到10倍
java·spring boot·后端
转转技术团队2 小时前
空间换时间-将查询数据性能提升100倍的计数系统实践
java·后端·架构
r0ad2 小时前
SpringCloud2023实战之接口服务测试工具SpringBootTest
spring boot·后端·spring cloud