21

我正在使用 API 并尝试在 C# 中执行 JSON PUT 请求。这是我正在使用的代码:

    public static bool SendAnSMSMessage()
    {
        var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://apiURL");
        httpWebRequest.ContentType = "text/json";
        httpWebRequest.Method = "PUT";

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            string json = **// Need to put data here to pass to the API.**

            streamWriter.Write(json);
        }
        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            var responseText = streamReader.ReadToEnd();
            //Now you have your response.
            //or false depending on information in the response
            return true;
        }
    }

问题是我不知道如何将数据传递给 API。所以就像在 JavaScript 中我会做这样的事情来传递数据:

        type: 'PUT',
        data: { 'reg_FirstName': 'Bob',
                'reg_LastName': 'The Guy',
                'reg_Phone': '123-342-1211',
                'reg_Email': 'someemail@emai.com',
                'reg_Company': 'None',
                'reg_Address1': 'Some place Dr',
                'reg_Address2': '',
                'reg_City': 'Mars',
                'reg_State': 'GA',
                'reg_Zip': '12121',
                'reg_Country': 'United States'

我将如何在 C# 中做同样的事情?谢谢!

4

2 回答 2

18
httpWebRequest.ContentType = "text/json";

绝对应该是:

httpWebRequest.ContentType = "application/json";

除此之外,我认为您当前的代码没有任何问题。

就 JSON 生成部分而言,您可以使用JSON 序列化程序:

var serializer = new JavaScriptSerializer();

string json = serializer.Serialize(new 
{
    reg_FirstName = "Bob",
    reg_LastName = "The Guy",
    ... and so on of course
});

在这个例子中,我显然使用了一个匿名对象,但您可以完美地定义一个属性匹配的模型,然后将该模型的一个实例传递给该Serialize方法。您可能还想查看Json.NET库,它是一个第三方 JSON 序列化程序,它比内置的 .NET 更轻、更快。


但总而言之,您可能还听说过ASP.NET Web API以及即将推出的 .NET 4.5。如果您这样做了,您应该知道将会有一个 API HTTP Web 客户端 ( HttpClient) 专门针对这些需求量身定制。使用 aWebRequest来使用启用 JSON 的 API 将在几个月内被视为过时的代码。我之所以提到这一点,是因为您现在可以使用 NuGet 来使用这个新客户端,并简化可怜的灵魂(负责将您的代码迁移到 .NET XX)的生活,他们将在几年后查看您的代码,并且可能甚至不知道 aWebRequest是什么:-)

于 2012-06-28T16:25:51.837 回答
12

如果您想从 .NET C# 客户端模仿 JavaScript 行为,您还必须在 Request 对象上设置一些额外的配置,除了 ContentType,这是一个工作示例:

string serializedObject = Newtonsoft.Json.JsonConvert.SerializeObject(entity);
HttpWebRequest request = WebRequest.CreateHttp(storeUrl);
request.Method = "PUT";
request.AllowWriteStreamBuffering = false;
request.ContentType = "application/json";
request.Accept = "Accept=application/json";
request.SendChunked = false;
request.ContentLength = serializedObject.Length;
using (var writer = new StreamWriter(request.GetRequestStream()))
{
    writer.Write(serializedObject);
}
var response = request.GetResponse() as HttpWebResponse;

这样,完整的内容将与请求一起发送,因此 ASP.NET MVC WebAPI 数据绑定器可以发挥它们的魔力。

不用说,您应该注意内容的大小,因为它将一次性发送,而不是流式传输/分块。

于 2013-11-26T13:21:46.810 回答