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

      }

结果如下:

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

相关推荐
IT_陈寒6 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
易协同低代码7 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo7 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志8 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..8 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects8 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰8 小时前
一些基础和问题解决
后端
陈随易8 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN8 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp
Imchendiana8 小时前
《狂人日记NO.9》— 前后端一把梭,我的全栈实录
前端·后端