zoukankan      html  css  js  c++  java
  • Restsharp常见格式的发送分析

    1.传递匿名对象JSON格式

     public string Pay(string apisecret, string apikey, string token)
            {
                try
                {
                    string url = "https://******//test";            
                    var client = new RestClient(url);             
              var request = new RestRequest(Method.POST);
                    var tran = new
                    {
                        merchant_ref = "Astonishing-Sale",
                        transaction_type = "purchase"
                    };
                    //生成随机数
                    RandomNumberGenerator rng = RNGCryptoServiceProvider.Create();
                    byte[] random = new Byte[8];
                    rng.GetBytes(random);
                    string NONCE = Math.Abs(BitConverter.ToInt64(random, 0)).ToString();
                    //生成时间戳
                    string TIMESTAMP = ((long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds).ToString();
                    //获取JSON字符内容
                    string paybody = string.Empty;
    
                    if (tran.transaction_type != null)
                    {
                        paybody = SimpleJson.SerializeObject(tran);
                    }
      
                    string auth = GetAuth(apisecret, apikey, token, paybody, NONCE, TIMESTAMP);
                    request.AddHeader("Content-Type", "application/json");
                    request.AddHeader("apikey", apikey);
                    request.AddHeader("token", token);
                    request.AddHeader("Authorization", auth);
                    request.AddHeader("nonce", NONCE);
                    request.AddHeader("timestamp", TIMESTAMP);
                    request.AddJsonBody(tran);//自动转换为JSON
                    IRestResponse response = client.Execute(request);
                    var content = response.Content;               return content;
                }
                catch (Exception e)
                {return string.Empty;
    
                }
            }
      

    2.multipart/form-data上传文件

    根据Restsharp源码可以发现如果使用了AddFile了会自动添加multipart/form-data参数           

                string server = "http://*****//Upload";
                string picurl = "C:\Users\Administrator\Desktop\555.png";
                string testparams = "testpicupload";
                RestClient restClient = new RestClient(server);
                //restClient.Encoding = Encoding.GetEncoding("GBK");//设置编码格式
                RestRequest restRequest = new RestRequest("/images");
                restRequest.RequestFormat = DataFormat.Json;
                restRequest.Method = Method.POST;
                //restRequest.AddHeader("Authorization", "Authorization");//当需要设置认证Token等情况时使用默认不需要
                //restRequest.AddHeader("Content-Type", "multipart/form-data");//如果使用了AddFile会自动添加否则请手动设置
                restRequest.AddParameter("test", testparams);
                // restRequest.AddFile("pic", picurl);//压缩格式
                restRequest.AddFile("pic", picurl, contentType: "application/x-img");    //非压缩格式 如果此处不设置为contentType 则默认压缩格式
                var response = restClient.Execute(restRequest);
                var info= response.Content;

    3.直接传递不带参数的RequestBody:有的时候接口并不包含参数名而是直接以body流的方式传输的这时候使用上面添加参数的方式就无效了,如果发送呢,RestSharp里保留了AddBody和 ParameterType.RequestBody来实现

    request.AddParameter("text/xml", body, ParameterType.RequestBody);
    req.AddParameter("application/json", body, ParameterType.RequestBody);
    

      

    根据AddBody源码发现实际转换最终使用的都是 AddParameter(contentType, serialized, ParameterType.RequestBody) 这个方法

     public IRestRequest AddBody(object obj, string xmlNamespace)
            {
                string serialized;
                string contentType;
                switch (this.RequestFormat)
                {
                    case DataFormat.Json:
                        serialized = this.JsonSerializer.Serialize(obj);
                        contentType = this.JsonSerializer.ContentType;
                        break;
                    case DataFormat.Xml:
                        this.XmlSerializer.Namespace = xmlNamespace;
                        serialized = this.XmlSerializer.Serialize(obj);
                        contentType = this.XmlSerializer.ContentType;
                        break;
                    default:
                        serialized = "";
                        contentType = "";
                        break;
                }
    
                // passing the content type as the parameter name because there can only be
                // one parameter with ParameterType.RequestBody so name isn't used otherwise
                // it's a hack, but it works :)
                return this.AddParameter(contentType, serialized, ParameterType.RequestBody);
            }
     /// <summary>
            /// Adds a parameter to the request. There are four types of parameters:
            /// - GetOrPost: Either a QueryString value or encoded form value based on method
            /// - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection
            /// - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId}
            /// - RequestBody: Used by AddBody() (not recommended to use directly)
            /// </summary>
            /// <param name="name">Name of the parameter</param>
            /// <param name="value">Value of the parameter</param>
            /// <param name="type">The type of parameter to add</param>
            /// <returns>This request</returns>
            public IRestRequest AddParameter(string name, object value, ParameterType type)
            {
                return this.AddParameter(new Parameter
                                         {
                                             Name = name,
                                             Value = value,
                                             Type = type
                                         });
            }
      
           

    4..二进制数据:(如下方式发送的格式和直接使用二进制写入是相同的)

                string server = "http://******/Upload";
                RestClient restClient = new RestClient(server);
                restClient.Encoding = Encoding.GetEncoding("GBK");//设置编码格式
                RestRequest restRequest = new RestRequest(Method.POST);          
                restRequest.Method = Method.POST;   
                var bb = new byte[] { 0x30, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x12, 0x40, 0x42 };     
                restRequest.AddParameter("application/pdf", bb, ParameterType.RequestBody);
                var response = restClient.Execute(restRequest);
                string s = response.Content;

     测试Demo:

      [TestMethod]
            public void TestRestsharpBinaryBody()
            {
                 string server = "http://******/Upload";
                RestClient restClient = new RestClient(server);
                restClient.Encoding = Encoding.GetEncoding("GBK");//设置编码格式
                RestRequest request = new RestRequest(Method.POST);
                request.Method = Method.POST;
    
                //===========二进制===测试通过=================
                //var bb = new byte[] { 0x30, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,0x40, 0x42 };            
                //request.AddParameter("application/pdf", bb, ParameterType.RequestBody);
    
                //==============XML字符串=====测试通过==============    
                /**
                 * 发送内容
                 * <root></root>
                 * */
                string x = "<root></root>";//XML字符串
                request.AddParameter("text/xml", x, ParameterType.RequestBody);
    
                //=============Json转换==================
                /**
                 * 发送内容
                 * {"id":1,"name":"zhangsan"}
                 * */
                //var x = new { id = 1, name = "zhangsan" };
                //request.AddJsonBody(x);
    
                //============object转XML==============  
                /**
                 * 发送内容
                 * <Dummy>
                     <A>Some string</A>
                     <B>Some string</B>
                   </Dummy>
                 * */
                //request.AddXmlBody(new Dummy());//对象转XML 非匿名对象可以 匿名对象失败
    
                /***
                 * 发送内容
                <Dummy xmlns="Root">
                      <A>Some string</A>
                      <B>Some string</B>
                </Dummy>
                 * */
                request.AddXmlBody(new Dummy(),"Root");//对象转XML 非匿名对象可以 匿名对象失败 Root为命名空间           
                var response = restClient.Execute(request);
                string s = response.Content;
                Assert.IsNotNull(response.Content);
            }
    public  class Dummy
        {
            public string A { get; set; }
            public string B { get; set; }
    
            public Dummy()
            {
                A = "Some string";
                B = "Some string";
            }
        }
  • 相关阅读:
    Volatile vs. Interlocked vs. lock
    TransactionScope IsolationLevel 事务隔离级别
    C# LinqAggregate
    .net线程入门1进程
    删除centos更新后多余的内核
    网页中怎么导入css的3方式
    面试常用基础理论(三)
    面试常用基础理论(四)
    Jmeter基本概念
    面试常用基础理论(二)
  • 原文地址:https://www.cnblogs.com/merray/p/7089747.html
Copyright © 2011-2022 走看看