三种方式在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;
          }

      }

结果如下:

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

相关推荐
柏油5 小时前
MySQL InnoDB 行锁
数据库·后端·mysql
咖啡调调。5 小时前
使用Django框架表单
后端·python·django
白泽talk5 小时前
2个小时1w字| React & Golang 全栈微服务实战
前端·后端·微服务
摆烂工程师5 小时前
全网最详细的5分钟快速申请一个国际 “edu教育邮箱” 的保姆级教程!
前端·后端·程序员
一只叫煤球的猫6 小时前
你真的会用 return 吗?—— 11个值得借鉴的 return 写法
java·后端·代码规范
Asthenia04126 小时前
HTTP调用超时与重试问题分析
后端
颇有几分姿色6 小时前
Spring Boot 读取配置文件的几种方式
java·spring boot·后端
AntBlack6 小时前
别说了别说了 ,Trae 已经在不停优化迭代了
前端·人工智能·后端
@淡 定6 小时前
Spring Boot 的配置加载顺序
java·spring boot·后端