c# - C# WebClient 在 POST 请求中上传 JSON
问题描述
我有一些 JSON 格式的数据,需要通过 POST 请求发送到网址。数据类似于以下示例:
[
{
"Id":0,
"Name":"John"
},
{
"Id":0,
"Name": "James"
}
]
NameValueCollection
我通常使用以下方法上传数据没有问题WebClient.UploadValues()
:
using (WebClient Client = InitWebClient()) // InitWebClient() initialises a new WebClient and sets the BaseAddress and Encoding properties
{
NameValueCollection Values = new NameValueCollection
{
{"Id", "0"},
{"Name", "John"}
};
Client.UploadValues("/api/example", "POST", Values);
}
然而,由于这个 JSON 请求是一个列表(并且必须始终采用列表的形式,即使只有一个项目被上传),我不知道这是如何完成的。
由于编程限制,我需要使用 WebClient 对象来完成所有这些工作。
解决方案
有人已经回答了这个问题,但由于某种原因他们的答案被删除了。然而,他们的解决方案是有效的,所以我在下面汇总了一个粗略的实现(它根本不是动态的,但它应该可以帮助遇到与我类似的问题的其他人):
using (WebClient Client = InitWebClient())
{
List<MyJsonObject> Items = new List<MyJsonObject>();
// The following could easily be made into a for loop, etc:
MyJsonObject Item1 = new MyJsonObject() {
Id = 0,
Name = "John"
};
Items.Add(Item1);
MyJsonObject Item2 = new MyJsonObject() {
Id = 1,
Name = "James"
};
Items.Add(Item2);
string Json = Newtonsoft.Json.JsonConvert.SerializeObject(Items)
Client.Headers[HttpRequestHeader.ContentType] = "application/json";
Client.UploadValues("/api/example", "POST", Json);
}
这是将被序列化的对象:
public class MyJsonObject {
public int Id { get; set; }
public string Name { get; set; }
}
推荐阅读
- algorithm - How to effectively check whether a path is inside a series of bounding boxes?
- python - Python TypeError: 'bool' object is not iterable
- laravel-5 - Laravel 5.4 eloquent relationship and local scope
- gluon - Gluon Charm Down PlatformFactory 的替代品?
- python - Sklearn 分类器
- java - JMS 侦听器正在自动关闭
- swagger - Swagger 正在为 get 方法添加额外的 body 参数
- c++ - 使用 cmake 链接错误
- python - 从 Python 脚本调用 autoit 脚本
- nskeyedarchiver - 如何在 iOS 12 中替换 NSKeyedArchiver 的初始化程序 init(forWritingWith:) 来编码 CKRecord 的元数据