ASP.NET Core使用HttpWebRequest发送请求

这里所讲的getpost请求,与平时我们在前台通过js传的getpost并不相同。比如我们有这样的一个场景:我们需要读取一个api的数据,在这个过程,我们想要在后台进行封装,从而返回给前台一个操作结果。就好像,我们在做微信开发的时候,自定义菜单获取Access_Token我们都是通过在后台对其进行getpost请求来封装。比较抽象,示意图如下:

在这里插入图片描述

首先创建一个API项目,并创建一个类:

在这里插入图片描述

NuGetMicrosoft.AspNetCore.Mvc.NewtonsoftJson 作为格式化JSON字符串的工具类。这里掌握两个方法即可:
SerializeObject:将任意的object转换为JSON字符串
DeserializeObject< T >:将JSON字符串转换数据模型

在这里插入图片描述

public class Product
    {
    
    
        /// <summary>
        /// 物料编号
        /// </summary>
        public string MaterialNo {
    
     get; set; }

        /// <summary>
        /// 物料名称
        /// </summary>
        public string MaterialName {
    
     get; set; }

        /// <summary>
        /// 数量
        /// </summary>
        public int Quntity {
    
     get; set; }

        /// <summary>
        /// 生产日期
        /// </summary>
        public string ProductDate {
    
     get; set; }
    }

创建一个空的API控制器Values,代码如下:

[HttpGet]
        public IEnumerable<Product> Get()
        {
    
    
            List<Product> list = new List<Product>();
            for (int i = 0; i < 3; i++)
            {
    
    
                Product model = new Product()
                {
    
    
                    MaterialNo="ASN20200506"+i,
                    MaterialName="精品盒"+i,
                    Quntity=2000,
                    ProductDate=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                };
                list.Add(model);
            }
            return list;
        }

        [HttpGet("{MaterialNo}")]
        public Product Get(string MaterialNo)
        {
    
    
            return new Product()
            {
    
    
                MaterialNo = MaterialNo,
                MaterialName = "GET精品盒:" + MaterialNo,
                Quntity = 2000,
                ProductDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
            };
        }

        [HttpPost]
        public object Post(Product model)
        {
    
    
            return JsonConvert.SerializeObject(model);
        }

作一下代码说明:
默认的GET请求列表
带参的GET请求给定的值
POST方法:用于提供其他项目对该API的POST请求
运行程序,切忌不要关闭,因为其他项目要进行调用
请求规则/api/控制器名称

在这里插入图片描述

创建一个新的Web项目,同样创建一个和上面相同的类,并对HomeComtroller进行改造

在这里插入图片描述

NuGetMicrosoft.AspNetCore.Mvc.NewtonsoftJson 作为格式化JSON字符串的工具类。
作一下简单代码说明:
进行Request的时候,ContentTypeMethod是必须的
ContentTypeapplication/json;charset=utf-8指定参数类型
Methodpost 指定指定对其进行 get 还是 post
其余的照搬即可

public IActionResult Index()
        {
    
    
            string url = "http://localhost:64643/api/values";
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            Stream stream = res.GetResponseStream();
            StreamReader reader = new StreamReader(stream);
            List<Product> result = JsonConvert.DeserializeObject<List<Product>>(reader.ReadToEnd());
            reader.Close();
            stream.Close();
            return Json(result);
            //return View();
        }

        public IActionResult Get()
        {
    
    
            string url = "http://localhost:64643/api/values/ASN20200128";
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            Stream stream = res.GetResponseStream();
            StreamReader reader = new StreamReader(stream);
            Product model = JsonConvert.DeserializeObject<Product>(reader.ReadToEnd());
            reader.Close();
            stream.Close();
            return Json(model);
        }

        public IActionResult Post()
        {
    
    
            Product model = new Product()
            {
    
    
                MaterialNo = "ASN20200506",
                MaterialName = "POST精品盒",
                Quntity = 2000,
                ProductDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
            };
            string str = JsonConvert.SerializeObject(model);
            string url = "http://localhost:64643/api/values";
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "post";
            req.ContentType = "application/json;charset=utf-8";
            Stream reqStream = req.GetRequestStream();
            byte[] reqBytes = Encoding.UTF8.GetBytes(str);
            reqStream.Write(reqBytes, 0, reqBytes.Length);
            reqStream.Close();

            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            Stream resStream = res.GetResponseStream();
            StreamReader reader = new StreamReader(resStream);
            var result = JsonConvert.DeserializeObject<Product>(reader.ReadToEnd());
            reader.Close();
            resStream.Close();
            return Json(result);
        }

对默认GET进行远程调用测试:

在这里插入图片描述

与定义的数据相同,请求成功!

在这里插入图片描述

对带参的GET进行测试:

在这里插入图片描述

与预想的数据一致,成功!

在这里插入图片描述

对POST进行验证:

在这里插入图片描述在这里插入图片描述

与返回值相同,成功!

在这里插入图片描述

仍需注意的一点是,当部署API项目在服务器上的时候,是要对该项目作跨域配置的,下一节我们再进行详细讲解,如何配置跨域。

猜你喜欢

转载自blog.csdn.net/qq_42799562/article/details/113356567