将值传递给C#中的PUT JSON请求

我正在使用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#中做同样的事情? 谢谢!

 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 )专门为这些需求量身定制。 使用WebRequest来使用支持JSON的API将在几个月内被视为过时代码。 我之所以提到这一点,是因为你现在可以使用NuGet来使用这个新客户端并简化穷人的生活(任务是将代码迁移到.NET XX),这将在几年后查看你的代码,可能甚至都不知道WebRequest是什么:-)

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

 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数据绑定器可以发挥其魔力。

不用说,你应该小心内容大小,因为它将一次性发送,而不是流式/块式。