使用 C# 和 HttpWebRequest 向端点发送 POST 请求

Posted

技术标签:

【中文标题】使用 C# 和 HttpWebRequest 向端点发送 POST 请求【英文标题】:Send a POST request to an endpoint with C# and HttpWebRequest 【发布时间】:2021-11-17 12:13:57 【问题描述】:

使用以下代码(当然使用 GET 方法)向端点发送 GET 请求对我来说没有问题,但我无法执行 POST 请求。有人可以解释一下,我必须做什么才能发布示例性 JSON-Body 吗?

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Globalization;
using System.Net;
using System.Threading;
using System.IO;
using System.Text;


namespace RestTesting


    class Program
    
        static void Main(string[] args)
        

            string url;
            url = "https://server.APIEndpoint/REST/";

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "application/json";
            request.Accept = "application/json";
            request.KeepAlive = true;

            request.Credentials = CredentialCache.DefaultCredentials;

            Console.WriteLine("Request: 0 \"1\" ...", request.Method, request.RequestUri);
            Console.WriteLine(request.Headers);
            Console.WriteLine(request.ContentLength);

            try
            
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                Console.WriteLine(String.Format("Response: HTTP/0 1 (1:d)\n", response.ProtocolVersion, response.StatusCode));

                Console.WriteLine(response.Headers);
                string responseText;

                using (var reader = new System.IO.StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8))
                
                    responseText = reader.ReadToEnd();
                

                Console.WriteLine(response.ContentType);

                if (response.ContentType.StartsWith("application/json"))
                
                    JObject json = (JObject)JObject.Parse(responseText);
                    Console.WriteLine(json.ToString());
                

            
            catch (Exception err)
            
                Console.WriteLine(err);
            

            Console.WriteLine("Press enter to close...");
            Console.ReadLine();

        
    


这是一个 JSON 正文:


"reference": "Test", 
"info": "additionalInfo", 
"ID": null, 
"confidential": false,

问题是:System.Net.WebException:远程服务器返回错误:(404)未找到。在 System.Net.HttpWebRequest.GetResponse() 在 RestTesting.Program.Main(String[] args)

当我尝试像下面那样发布 JSON-Body 时发生该错误(在 WebRequest.Create 方法之后):

using (var streamWriter = new StreamWriter(request.GetRequestStream()))
    
        string data = @"
        "reference": "Test", 
        "info": "additionalInfo", 
        "ID": null, 
        "confidential": false,  
    ";
    streamWriter.Write(data);

非常感谢您!

【问题讨论】:

有什么问题?你得到错误异常是什么?你的代码没有编译吗?显然你正在发帖。 对不起,完全忘了提问题:System.Net.WebException:远程服务器返回错误:(404)未找到。在 System.Net.HttpWebRequest.GetResponse() 在 RestTesting.Program.Main(String[] args) 首先,如果您可以将这样的消息粘贴到问题中而不是 cmets,则更容易理解。其次,问题不是您的帖子要求,而是您发布的 URL 不存在。您需要检查 api/page 端点并确认它存在。 正确意味着那里有东西,但它没有读取您发送的内容。 为您的请求主体创建一个类对象,然后使用 Json.NET 对其进行序列化,并将序列化的对象写入请求流,确保您也为流编写器提供正确的Encoding。这将确保您发送有效的 json。 【参考方案1】:

解决方案:我只是在 JSON-Body 的代码中忘记了逗号。

【讨论】:

以上是关于使用 C# 和 HttpWebRequest 向端点发送 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 HttpWebRequest.Create 时的 C# vs VB 语法

C#使用HttpWebRequest发送数据和使用HttpWebResponse接收数据的一个简单示例

C# httpwebrequest - 使用系统库创建 json 主体

C# HttpWebRequest.GetResponse - 如何处理非异常与 webexception 响应的 StatusCode 使用情况?

C#中HttpWebRequest的用法详解

C#中HttpWebRequest的用法详解