ZetCode

C# GET/POST 请求

最后修改于 2023 年 7 月 5 日

C# GET/POST 教程展示了如何在 C# 中发送 HTTP GET POST 请求。 我们使用 WebRequest 和 HttpClient。

HTTP

超文本传输协议 (HTTP) 是一种用于分布式、协作式、超媒体信息系统的应用协议。HTTP 是万维网数据通信的基础。

在示例中,我们使用了 httpbin.org,这是一个免费提供的 HTTP 请求和响应服务,以及 webcode.me,这是一个用于测试的微型 HTML 页面。

HTTP GET

HTTP GET 方法请求指定资源的表示。使用 GET 的请求应该只检索数据。

HTTP POST

HTTP POST 方法将数据发送到服务器。它通常用于上传文件或提交完成的 Web 表单。

C# 使用 WebRequest 的 GET 请求

WebRequest 向指定的统一资源标识符 (URI) 发出请求。

Program.cs
using System.Net;

var url = "http://webcode.me";

var request = WebRequest.Create(url);
request.Method = "GET";

using var webResponse = request.GetResponse();
using var webStream = webResponse.GetResponseStream();

using var reader = new StreamReader(webStream);
var data = reader.ReadToEnd();

Console.WriteLine(data);

该程序创建一个 GET 请求来获取一个简单页面的内容。 它将页面的 HTML 内容打印到控制台。

var request = WebRequest.Create(url);

该请求使用 Create 初始化。

request.Method = "GET";

我们将请求的方法设置为 GET

using var webResponse = request.GetResponse();

GetResponse 返回一个 Web 响应,其中包含对请求的响应。

using var webStream = webResponse.GetResponseStream();

为了读取数据,我们获取流类的实例,用于从资源读取数据。

using var reader = new StreamReader(webStream);
var data = reader.ReadToEnd();

我们从流中读取所有数据。

$ dotnet run
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My html page</title>
</head>
<body>

    <p>
        Today is a beautiful day. We go swimming and fishing.
    </p>
    
    <p>
         Hello there. How are you?
    </p>
    
</body>
</html>

C# 使用 WebRequest 的 POST 请求

下一个示例使用 WebRequest 创建一个 POST 请求。

Program.cs
using System.Text;
using System.Net;
using System.Text.Json;

var url = "https://httpbin.org/post";

var request = WebRequest.Create(url);
request.Method = "POST";

var user = new User("John Doe", "gardener");
var json = JsonSerializer.Serialize(user);
byte[] byteArray = Encoding.UTF8.GetBytes(json);

request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;

using var reqStream = request.GetRequestStream();
reqStream.Write(byteArray, 0, byteArray.Length);

using var response = request.GetResponse();
Console.WriteLine(((HttpWebResponse)response).StatusDescription);

using var respStream = response.GetResponseStream();

using var reader = new StreamReader(respStream);
string data = reader.ReadToEnd();
Console.WriteLine(data);

record User(string Name, string Occupation);

我们向 https://httpbin.org/post 页面发送一个 POST 请求。 发送的数据采用 JSON 格式。

var request = WebRequest.Create(url);
request.Method = "POST";

我们将请求的方法设置为 POST。

var user = new User("John Doe", "gardener");
var json = JsonSerializer.Serialize(user);
byte[] byteArray = Encoding.UTF8.GetBytes(json);

我们将用户对象序列化为 JSON,并将 JSON 数据转换为字节数组。

using var reqStream = request.GetRequestStream();
reqstream.Write(byteArray, 0, byteArray.Length);

我们使用 GetRequestStream 获取请求的流,并使用 Write 将字节数组写入流中。

using var response = request.GetResponse();

我们使用 GetResponse 获取响应。

Console.WriteLine(((HttpWebResponse)response).StatusDescription);

我们打印响应的状态。

using var respStream = response.GetResponseStream();

using var reader = new StreamReader(respStream);
string data = reader.ReadToEnd();
Console.WriteLine(data);

我们从响应流中读取数据。

$ dotnet run
OK
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "{\"Name\":\"John Doe\",\"Occupation\":\"gardener\"}": ""
  }, 
  "headers": {
    "Content-Length": "43", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "X-Amzn-Trace-Id": "Root=1-5ffb119c-010dea546a9b4c8c370bca46"
  }, 
  "json": null, 
  "origin": "188.167.250.74", 
  "url": "https://httpbin.org/post"
}

C# 使用 HttpClient 的 GET 请求

HttpClient 提供了一个基类,用于发送 HTTP 请求和接收来自 URI 标识的资源的 HTTP 响应。

Program.cs
using var client = new HttpClient();
var content = await client.GetStringAsync("http://webcode.me");

Console.WriteLine(content);

该程序使用 httpclient 的 GetStringAsync 创建一个异步 GET 请求。

C# 使用 HttpClient 的 POST 请求

以下示例使用 HttpClient 创建一个 POST 请求。

Program.cs
using System.Text;
using System.Text.Json;

var user = new User("John Doe", "gardener");

var json = JsonSerializer.Serialize(user);
var data = new StringContent(json, Encoding.UTF8, "application/json");

var url = "https://httpbin.org/post";
using var client = new HttpClient();

var response = await client.PostAsync(url, data);

string result = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(result);


record User(string Name, string Occupation);

使用 PostAsync 发送带有 JSON 有效负载的异步 POST 请求; 使用 ReadAsStringAsync 读取响应。

下一个示例使用 DictionaryFormUrlEncodedContentFormUrlEncodedContent 是一个容器,用于存储使用 application/x-www-form-urlencoded MIME 类型编码的名称/值对。

Program.cs
using System.Text;
using System.Text.Json;

var values = new Dictionary<string, string>
{
    { "name", "John Doe" },
    { "occupation", "gardener" }
};

var data = new FormUrlEncodedContent(values);

var url = "https://httpbin.org/post";
using var client = new HttpClient();

var response = await client.PostAsync(url, data);

string result = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(result);

在此示例中,数据存储在字典中。 我们将字典放入 FormUrlEncodedContent 容器中。

来源

使用 HttpClient 类发出 HTTP 请求 - 语言参考

在本文中,我们展示了如何在 C# 中生成 GET 和 POST 请求。

作者

我叫 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程