我正在使用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#中做同样的事情?谢谢!
答案 0 :(得分:14)
httpWebRequest.ContentType = "text/json";
绝对应该是:
httpWebRequest.ContentType = "application/json";
除此之外,我没有看到您当前的代码有任何问题。
就JSON生成部分而言,您可以使用JSON serializer:
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
是什么: - )
答案 1 :(得分:10)
如果你想模仿.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数据绑定器可以发挥其魔力。
毋庸置疑,您应该小心内容大小,因为它将一次性发送,而不是流式/块式。