public class GetDataByWebApi
{
    /// <summary>
    /// 通过web api获取数据的方法
    /// </summary>
    /// <param name="url">api的url</param>
    /// <param name="method">请求类型,默认是get</param>
    /// <param name="postData">post请求所携带的数据</param>
    /// <returns></returns>
    public static string RequestData(string url, string method = "Get", string postData = null)
    {
        try
        {
            method = method.ToUpper();
            //设置安全通信协议   我方公司服务器有些强制使用tls1.2的安全通信协议,所以至少包含SecurityProtocolType.Tls12   如果沒有SecurityProtocolType.Tls12设置会报错:HttpWebRequest底层连接已关闭:传送时发生意外错误  
            ServicePointManager.SecurityProtocol =
                SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls |
                SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;  

            //创建请求实例
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            //设置请求类型
            request.Method = method;
            //设置请求消息主体的编码方法
            request.ContentType = "application/json";

            //POST方式處理
            if (method == "POST")
            {
                //用UTF8字符集对post请求携带的数据进行编码,可防止中文乱码
                byte[] byteArray = Encoding.UTF8.GetBytes(postData);
                //指定客户端post请求携带的数据的长度
                request.ContentLength = byteArray.Length;

                //创建一个tream,用于写入post请求所携带的数据(该数据写入了请求体)
                Stream stream = request.GetRequestStream();
                stream.Write(byteArray, 0, byteArray.Length);
                stream.Close();
            }

            //获取请求的响应实例
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            //获取读取流实体,用来以UTF8字符集读取响应流中的数据
            StreamReader myStreamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            //进行数据读取
            string retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            return retString;
        }
        catch (Exception ex)
        {
            //拋出異常
            throw ex;
        }
    }
}

上面通用方法如何使用,看下面的实例展示:

首先是WebApi提供方所提供的方法如下:

namespace WebApi.Controllers
{
    public class MyValues2Controller : ApiController
    {
        // GET api/<controller>/5
        public User GetUser(string empID)
        {
            {
                //这里是逻辑代码--通过empID在数据库查找到用户...                          
            }
            User user = new User() { EmpID = "F2847", Name = "唐三", Age = 18, Address = "石村" };
            return user;
        }

        // POST api/<controller>
        public bool PostUserData([FromBody] User value)
        {
            User user = value;
            {
                //这里是逻辑代码--将上传的数据保存到数据库
            }
            return true;//上传成功返回值
        }
    }
}

然后是WebApi调用方是如何调用的,如下:

namespace WebApi.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            //调用Get方法
            string result=GetDataByWebApi.RequestData("https://localhost:44321/api/MyValues2/PostUserData?empid=123");
            //根据request.ContentType = "application/json"知道返回的是json字符串,下面可以将json字符串序列化为对象
            User user1 = JsonConvert.DeserializeObject<User>(result);


            //调用Post方法
            User user2 = new User() { EmpID = "F2847", Name = "唐三", Age = 18, Address = "石村" };
            string jsonstr= JsonConvert.SerializeObject(user2);
            result = GetDataByWebApi.RequestData("https://localhost:44321/api/MyValues2/PostUserData","Post",jsonstr);
            bool f= JsonConvert.DeserializeObject<bool>(result);

            ViewBag.Title = "Home Page";

            return View();
        }
    }
}

Tips:

        1.方法参数前加[FromBody]标识,表示该参数值应该从请求的
Body中获取,而不是从URL中获取。从URL获取参数值的弊端是URL有长度限制,当超过限制长度时请求将被拒绝,根本不会发出去。因此,当参数值过大时需要用[FromBody]参数进行传输。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐