WebClient 基本資訊

提供通用方法使用 WebRequest 類別傳送及接收 URI (支援 http:https:ftp:,和 file: ) 的資源

  • Namespace:System.Net
  • Assembly:System (System.dll)
  • 基本要求:.NET Framework 1.1 以上
  • WebClient 預設僅會傳送必要的 http header
  • 缺點:無法指定 Timeout ,另外保哥文章 利用 WebClient 類別模擬 HTTP POST 表單送出的注意事項有提到 不適合用來下載大量的檔案,高負載的網站也不適合這樣用,即便你用非同步的方式撰寫,也會讓 WebClient 因為佔據過多 Threads 而導致效能降低這我不知道怎麼模擬,請大家參考保哥文章

1. GET

  1. 寫法 1

    using (WebClient webClient = new WebClient())
    // 從 url 讀取資訊至 stream
    using(Stream stream = webClient.OpenRead("http://jsonplaceholder.typicode.com/posts"))
    // 使用 StreamReader 讀取 stream 內的字元
    using(StreamReader reader= new StreamReader(stream))
    {
    // 將 StreamReader 所讀到的字元轉為 string
    string request = reader.ReadToEnd();
    request.Dump();
    }
  2. 寫法 2
    // 建立 webclient
    using(WebClient webClient = new WebClient())
    {
    // 指定 WebClient 的編碼
    webClient.Encoding = Encoding.UTF8;
    // 指定 WebClient 的 Content-Type header
    webClient.Headers.Add(HttpRequestHeader.ContentType, "application/json");
    // 從網路 url 上取得資料
    var body = webClient.DownloadString("http://jsonplaceholder.typicode.com/posts");
    body.Dump();
    }

2. POST

WebClient 共有四種 POST 相關的方法

  1. UploadString(string)

    將 String 傳送至資源。

    • 以下 demo 會搭配 application/json

      // 建立 WebClient
      using (WebClient webClient = new WebClient())
      {
      // 指定 WebClient 編碼
      webClient.Encoding = Encoding.UTF8;
      // 指定 WebClient 的 Content-Type header
      webClient.Headers.Add(HttpRequestHeader.ContentType, "application/json");
      // 指定 WebClient 的 authorization header
      webClient.Headers.Add("authorization", "token {apitoken}");
      // 準備寫入的 data
      PostData postData = new PostData() { userId = 1123456, title = "yowko", body = "yowko test body 中文" };
      // 將 data 轉為 json
      string json = JsonConvert.SerializeObject(postData);
      // 執行 post 動作
      var result = webClient.UploadString("https://jsonbin.org/yowko/test", json);
      // linqpad 將 post 結果輸出
      result.Dump();
      }

        

  2. UploadData(byte[])

    將位元組陣列傳送至資源,並傳回含有任何回應的 Byte 陣列。

    • 以下 demo 會搭配 application/x-www-form-urlencoded

      // 建立 WebClient
      using (WebClient webClient = new WebClient())
      {
      // 指定 WebClient 編碼
      webClient.Encoding = Encoding.UTF8;
      // 指定 WebClient 的 Content-Type header
      webClient.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");
      // 指定 WebClient 的 authorization header
      webClient.Headers.Add("authorization", "token {apitoken}");
      //要傳送的資料內容(依字串表示)
      string postData = "id=12354&name=yowko&body=yowko test body 中文";
      //將傳送的字串轉為 byte array
      byte[] byteArray = Encoding.UTF8.GetBytes(postData);
      // 執行 post 動作
      var result = webClient.UploadData("https://jsonbin.org/yowko/test", byteArray);
      // linqpad 將 post 結果輸出
      result.Dump();
      }
  3. UploadValues (byte[])

    將 NameValueCollection 傳送至資源,並傳回含有任何回應的 Byte 陣列。

    • 不需指定 content type

      // 建立 WebClient
      using (WebClient webClient = new WebClient())
      {
      // 指定 WebClient 編碼
      webClient.Encoding = Encoding.UTF8;
      // 指定 WebClient 的 authorization header
      webClient.Headers.Add("authorization", "token {apitoken}");
      //要傳送的資料內容
      NameValueCollection nameValues = new NameValueCollection();
      nameValues["userId"] = "456";
      nameValues["title"] = "yowko";
      nameValues["body"]="yowko test body 中文"; // 執行 post 動作
      var result = webClient.UploadValues("https://jsonbin.org/yowko/test", nameValues);
      //將 post 結果轉為 string
      string resultstr = Encoding.UTF8.GetString(result);
      // linqpad 將 post 結果輸出
      resultstr.Dump();
      }
  4. UploadFile(byte[]) 今天不會介紹

    將本機檔案傳送至資源,並傳回含有任何回應的 Byte 陣列。

3. PUT

方法與 POST 相同,只需在 url 與 data 間多傳一個 method 的參數,範例中 PUT 是將 jsonbin 的網址改為 public

// 建立 WebClient
using (WebClient webClient = new WebClient())
{
// 指定 WebClient 編碼
webClient.Encoding = Encoding.UTF8;
// 指定 WebClient 的 Content-Type header
webClient.Headers.Add(HttpRequestHeader.ContentType, "application/json");
// 指定 WebClient 的 authorization header
webClient.Headers.Add("authorization", "token {apitoken}");
// 執行 PUT 動作
var result = webClient.UploadString("https://jsonbin.org/yowko/test/_perms","PUT", "");
// linqpad 將 post 結果輸出
result.Dump();
}

5. DELETE

方法與 POST 相同,只需在 url 與 data 間多傳一個 method 的參數,範例中 DELETE 是將 jsonbin 的網址改為 private

// 建立 WebClient
using (WebClient webClient = new WebClient())
{
// 指定 WebClient 編碼
webClient.Encoding = Encoding.UTF8;
// 指定 WebClient 的 Content-Type header
webClient.Headers.Add(HttpRequestHeader.ContentType, "application/json");
// 指定 WebClient 的 authorization header
webClient.Headers.Add("authorization", "token {apitoken}");
// 執行 DELETE 動作
var result = webClient.UploadString("https://jsonbin.org/yowko/test/_perms","DELETE", "");
// linqpad 將 post 結果輸出
result.Dump();
}

6. PATCH

方法與 POST 相同,只需在 url 與 data 間多傳一個 method 的參數

// 建立 WebClient
using (WebClient webClient = new WebClient())
{
// 指定 WebClient 編碼
webClient.Encoding = Encoding.UTF8;
// 指定 WebClient 的 Content-Type header
webClient.Headers.Add(HttpRequestHeader.ContentType, "application/json");
// 指定 WebClient 的 authorization header
webClient.Headers.Add("authorization", "token {api token}");
// 準備寫入的 data
PostData postData = new PostData() { title = "yowko 中文", body = "yowko body 中文" };
// 將 data 轉為 json
string json = JsonConvert.SerializeObject(postData);
// 執行 PATCH 動作
var result = webClient.UploadString("https://jsonbin.org/yowko/test","PATCH", json);
// linqpad 將 post 結果輸出
result.Dump();
}

7. 使用 proxy

有時候程式的 host 環境無法直接上網或是我們想要確認傳出去的相關資訊,就需要設定 proxy

// 建立 WebClient
using (WebClient webClient = new WebClient())
{
// 指定 WebClient 編碼
webClient.Encoding = Encoding.UTF8;
// 指定 WebClient 的 Content-Type header
webClient.Headers.Add(HttpRequestHeader.ContentType, "application/json");
// 指定 WebClient 的 authorization header
webClient.Headers.Add("authorization", "token {api token}");
//指令 proxy address
string proxyAddress = "http://127.0.0.1:8888";
//建立 proxy
WebProxy myProxy = new WebProxy(new Uri(proxyAddress));
//建立 proxy 的認證資訊
myProxy.Credentials = new NetworkCredential("{username}", "{password}");
//將 proxy 指定給 request 使用
webClient.Proxy = myProxy;
// 準備寫入的 data
PostData postData = new PostData() { userId=1, title = "yowko1", body = "yowko test body 中文" };
// 將 data 轉為 json
string json = JsonConvert.SerializeObject(postData);
// 執行 post 動作
var result = webClient.UploadString("https://jsonbin.org/yowko/test", json);
// linqpad 將 post 結果輸出
result.Dump();
}

參考資料

  1. WebClient 類別
  2. 利用 WebClient 類別模擬 HTTP POST 表單送出的注意事項
  3. 如何使用 WebRequest,HttpWebRequest 來存取 (GET,POST,PUT,DELETE,PATCH) 網路資源
  4. 使用 fiddler 內建 proxy 來截錄手機或是程式封包

使用 WebClient 來存取 GET,POST,PUT,DELETE,PATCH 網路資源的更多相关文章

  1. [Xamarin] 透過WebClient跟網路取得資料 (转帖)

    之前寫過一篇文章,關於在Android上面取得資料 透過GET方式傳資料給Server(含解決中文編碼問題) 我們來回顧一下 Android 端的Code: 有沒有超多,如果是在Xaramin下面,真 ...

  2. [技术博客]OKhttp3使用get,post,delete,patch四种请求

    OKhttp3使用get,post,delete,patch四种请求 1.okhttp简介 okhttp封装了大量http操作,大大简化了安卓网络请求操作,是现在最火的安卓端轻量级网络框架.如今okh ...

  3. 精讲响应式WebClient第3篇-POST、DELETE、PUT方法使用

    本文是精讲响应式WebClient第3篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...

  4. PHP用curl发送get post put delete patch请求

    function getUrl($url){ $headerArray = array("Content-type:application/json;", "Accept ...

  5. ORA-00054: 資源正被使用中, 請設定 NOWAIT 來取得它, 否則逾時到期

    1.查看被使用资源的OBJECT_ID SELECT *FROM DBA_OBJECTS WHERE OBJECT_NAME='OBJECT_NAME' 2.查看资源被谁占用SELECT * FROM ...

  6. 使用WebClient與HttpWebRequest的差異

    在<Windows Phone 7-下載檔案至Isolated Storage>提到了透過WebClient的功能將網站上的檔案下載至 WP7的Isoated Storage之中.但實際的 ...

  7. WebApi:WebApi的Self Host模式

    不用IIS也能執行ASP.NET Web API 转载:http://blog.darkthread.net/post-2013-06-04-self-host-web-api.aspx 在某些情境, ...

  8. Self-Host c#学习笔记之Application.DoEvents应用 不用IIS也能執行ASP.NET Web API

    Self-Host   寄宿Web API 不一定需要IIS 的支持,我们可以采用Self Host 的方式使用任意类型的应用程序(控制台.Windows Forms 应用.WPF 应用甚至是Wind ...

  9. VMware虛擬化技術實作問答

    http://www.netadmin.com.tw/article_content.aspx?sn=1202130002&ns=1203280001&jump=3 Q4:啟用VMwa ...

随机推荐

  1. Openssl ciphers命令

    一.简介 ciphers指令是用来展示用于SSL加密算法的工具 二.语法 openssl ciphers [-v] [-ssl2] [-ssl3] [-tls1] [cipherlist] 选项 -v ...

  2. thinkpad t480s重装win10后小红点失灵 无法启用

    问题描述: thinkpad t480s重装win10纯净版系统后,小红点失效,控制面板中Track Point设置页面被禁用. 解决方法: 可打开下述网址,下载并安装TrackPoint Firmw ...

  3. Debian/Linux系统安全配置教程

    禁止root SSH登陆 配置SSH Key 配置iptables 当我们安装完Linux系统作为服务器后,总有一系列的安全配置需要进行.特别是当你的服务器Ip是对外网开放的话.全世界有很多不怀好意的 ...

  4. 微信第三方登录测试时报Scope参数错误或没有Scope权限解决方法

    一 报错信息: 二 出现原因分析: 出现这种错误网上查出现有的原因是: 1. 订阅号没有相关的权限 2. 账号没有认证,没有相关的权限 那么这里遇到问题两种都不是.开发账号是 服务号,而且也是认证号. ...

  5. python report中文显示乱码

    环境:python2.7 测试框架: nose (1.3.7) nose-html-reporting (0.2.3) 问题:生成测试报告失败的时候,报告会抓取代码中的print,打开后看到的中文是乱 ...

  6. kcp流模式与消息模式对比

    kcp的流模式,和消息模式 流模式: 更高的网络利用率 更大的传输速度 解析数据相对更复杂 消息模式: 更小的网络利用率 更小的传输速度 解析数据相对更简单 消息模式的示意图 http://www.p ...

  7. javascript总结39: 元素获取的常见问题

    1 定义id属性的元素,不获取直接使用 由于id名具有唯一性,部分浏览器支持直接使用id名访问元素,但不是标准方式,生产环境下不推荐使用. 2 元素是对象 获取到的元素是DOM对象 ,DOM对象也有数 ...

  8. HDU 4714 Tree2cycle (树形DP)

    题意:给定一棵树,断开一条边或者接上一条边都要花费 1,问你花费最少把这棵树就成一个环. 析:树形DP,想一想,要想把一棵树变成一个环,那么就要把一些枝枝叶叶都换掉,对于一个分叉是大于等于2的我们一定 ...

  9. 编写高质量代码改善C#程序的157个建议——建议66:正确捕获多线程中的异常

    建议66:正确捕获多线程中的异常 多线程的异常处理需要采用特殊的方式.一下这种方式会存在问题: try { Thread t = new Thread((ThreadStart)delegate { ...

  10. Javascript 控制 让输入框不能输入 数字

    监听keypress事件.判断如果是数字的话阻止浏览器冒泡 <input type="text" id="test"> <script typ ...