C# 调用Web Api通用方法
C# 调用Web Api通用方法
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]参数进行传输。