Restsharp常見格式的發送分析

来源:http://www.cnblogs.com/merray/archive/2017/06/28/7089747.html
-Advertisement-
Play Games

1.傳遞匿名對象JSON格式 2.multipart/form-data上傳文件 根據Restsharp源碼可以發現如果使用了AddFile了會自動添加multipart/form-data參數 3.直接傳遞不帶參數的RequestBody:有的時候介面並不包含參數名而是直接以body流的方式傳輸的 ...


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";
        }
    }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • find /usr -size 4 查找2k(4個block)文件 find /usr -size +2048c 查找大於2k位元組文件 find /usr -size -2K 查找小於2k位元組文件 ...
  • make xxx_config實質上就是調用了 首先看MKCONFIG: 【註意】SRCTREE=源文件下的目錄 之後的語句: @$(MKCONFIG) $(@:_config=) arm arm920t EmbedSky NULL s3c2440就相當於執行 #mkconfig xxx arm a ...
  • 一、版本信息 mac 10.10.5 php 5.5.38 phpstorm 10.0.3 xdebug 版本需要與php匹配,匹配地址 :點我匹配 點我查看所有版本 提示:不確定xdebug版本的,把phpinfo()顯示的全部複製(command+a 全選再command+c複製)到文本框中,x ...
  • 首先,非常感謝微軟舉辦的這次活動,彙集不了少技術大拿,為大家呈現一堂高潮迭起的技術分享盛會。也非常感謝公司領導,頂著繁重業務的壓力,讓大家去充電,去學習新知識。 言歸正傳,談一下今天微軟分享的內容,以及個人的心得感受。 首先,微軟分享給大家的是Microsoft Service Fabric,即微軟 ...
  • 如果使用 IdentityServer4 做授權服務的負載均衡,預設情況下是不可以的,比如有兩個授權服務站點,一個資源服務綁定其中一個授權服務( 配置),如果通過另外一個授權服務獲取 ,然後拿這個 去訪問資源服務,會報 401 未授權錯誤,為什麼?原因在這: By default an access ...
  • 面向對象思想 不看後悔! 前言:整理這份資料的目的是為了幫助朋友們能夠更直觀的理解面向對象的編程。讓後來者能夠少走一些彎路。但其中不免有許多漏洞及錯誤,也還請前輩提出寶貴的更改意見,畢竟交流會讓我們不斷的進步。技術是日新月異的,他不會等待你的成長。技術要拿出來於別人交流,自己學是自己主觀意識上的理解 ...
  • 1、配置web.config 2、在Global.asax中添加啟動啟動ASP.NET 狀態服務代碼 ...
  • 如果你正在開發客戶端報表圖相關的應用,除了.NET自帶的控制項,你還可以考慮使用以下幾個控制項庫。 【OxyPlot】 OxyPlot是一個支持.NET的跨平臺繪圖庫。你可以在很多平臺上使用它,如WPF, Windows 8, Windows Phone, Windows Phone Silverlig ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...