zoukankan      html  css  js  c++  java
  • C#发起Http请求,调用接口

    //方法1. Post 异步请求,普通的异步请求,传输普通的字符串等,对于有html代码的字段值的传输支持不好,如果需要传输html,二进制等数据的传输,请使用下面第二个方法,即使用UploadDataAsync

    using (var client = new WebClient())
    {
    var paramJson = ObjectToJson(emailModel);
    client.Headers[HttpRequestHeader.ContentType] = "application/json";
    cli.UploadStringAsync(new Uri(url), paramJson);
    }

    //方法2. Post 异步请求,emailModel实体可包含byte[]的字段值

    下面传入的json就包含byte[]的字段序列化成json的,但注意一点,如果用Newtonsoft序列化byte[]的字段,序列化后的json是经过BaseString64编码后面的类似于AUUUAABWWWBBCCCC(瞎写的,示例而已)这样的字段串,

    这样序列后的json传入这个方法后byte[]字段的值会丢失,我们需要的其实是把比如byte[] files=[22,45,67,67,89,54,21]这个字段的值,序列化后得到[22,45,67,67,89,54,21]这个字符串,

    而不想得到经过BaseString64编码后面的类似于AUUUAABWWWBBCCCC的字符串,这时可以使用.net原装的JavascriptSerialize.Serialize(model)来达到这种效果,这点需要特别注意下,, 暂时没有找到Newtonsoft序列化byte[]为byte[]字符串的解决办法。

    using (var client = new WebClient())
    {
    var paramJson = ObjectToJson(emailModel);
    client.Headers[HttpRequestHeader.ContentType] = "application/json";
    var bytes = Encoding.UTF8.GetBytes(paramJson);
    client.UploadDataAsync(new Uri(url), "POST", bytes);
    }

    public static string ObjectToJson(object obj)
    {
    JavaScriptSerializer jsonSerialize = new JavaScriptSerializer();
    return jsonSerialize.Serialize(obj);
    }

    方法3. 使用RestSharp第三方库dll发起Http请求,emailModel实体可包含byte[]的字段值,Rest会自动处理传输数据,进行序列化

    var model = new { Name = "NotifyAdminPlaceOrder", Subject = "<%CompanyName%> Cash Exercise行权管理", Body = emailModel.Parameters["@Content"] };
    string url2 = "https://localhost:44300/system/GenerateMailTemplate";
    var request = new RestRequest();
    request.RequestFormat = DataFormat.Json;
    request.AddBody(model);
    var restClient = new RestClient(url2);
    restClient.PostAsync(request, null);

    方法4. 比较老的发起Web请求的方法,虽然代码陈旧但宝刀未老,是功能比较全面的选项之一。

    下面传入的json就包含byte[]的字段序列化成json的,但注意一点,如果用Newtonsoft序列化byte[]的字段,序列化后的json是经过BaseString64编码后面的类似于AUUUAABWWWBBCCCC(瞎写的,示例而已)这样的字段串,

    这样序列后的json传入这个方法后byte[]字段的值会丢失,我们需要的其实是把比如byte[] files=[22,45,67,67,89,54,21]这个字段的值,序列化后得到[22,45,67,67,89,54,21]这个字符串,

    而不想得到经过BaseString64编码后面的类似于AUUUAABWWWBBCCCC的字符串,这时可以使用.net原装的JavascriptSerialize.Serialize(model)来达到这种效果,这点需要特别注意下, 暂时没有找到Newtonsoft序列化byte[]为byte[]字符串的解决办法。

    /// <summary>
    /// 创建JSON请求
    /// </summary>
    /// <param name="url">请求的URL</param>
    /// <param name="json">请求中包含的JSON字符串参数</param>
    /// <param name="userAgent">请求的客户端浏览器信息,可以为空,或使用TC.Core.Web.BrowserUserAgent类获取</param>
    /// <param name="requestEncoding">请求编码</param>
    /// <returns></returns>
    public static HttpWebResponse CreateJSONReponse(string url, string json, string userAgent = "", Encoding requestEncoding = null)
    {
    if (requestEncoding == null)
    requestEncoding = Encoding.UTF8;

    var data = requestEncoding.GetBytes(json);
    var uri = new Uri(url);
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

    //此处为C#实现的一些标准http请求头添加方法,用上面的方面也可以实现
    request.ContentType = "application/json";
    request.Accept = "application/json, application/xml, text/json, text/x-json, text/javascript, text/xml";
    request.ContentLength = data.Length;
    request.UserAgent = string.IsNullOrEmpty(userAgent) ? "TC.Framework.MessageHandling" : userAgent;
    //此处添加标准http请求方面
    request.Method = "POST";

    System.IO.Stream sm = request.GetRequestStream();
    sm.Write(data, 0, data.Length);
    sm.Close();
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    return response;
    }

  • 相关阅读:
    ES6 => 箭头函数
    从零开始, 探索transition(vue-2.0)
    从零开始,零基础,一点一点探索vue-router(vue2.0)
    解决Vue请求 ‘No 'Access-Control-Allow-Origin' header is present on the requested resource’错误
    超详细,用canvas在微信小程序上画时钟教程
    钱兔
    天天飞燕
    小鱼
    键盘处理
    兼容iOS 10 资料整理笔记
  • 原文地址:https://www.cnblogs.com/itjeff/p/11883911.html
Copyright © 2011-2022 走看看