我正在尝试创建一个控制台应用程序,该应用程序能够通过调用特定的API将内容推送到数据库中。我无法控制数据库或API。当我已经创建了该API并测试了GET方法时,该API工作正常,但是我猜我的POST出了点问题。
因此,首先,创建一个 Product 对象,其中包含要发送到API的值。
Product product = new Product
{
productId = "27795",
amount = 1,
customerid = 0,
returnbasketid = true
};
这是应该调用API的POST方法的方法。
static async Task CreateProductAsync(HttpClient cons, Product product)
{
using (cons)
{
HttpResponseMessage res = cons.PostAsJsonAsync("", product).Result;
res.EnsureSuccessStatusCode();
Console.WriteLine(res.Content.ReadAsStringAsync().Result);
}
}
运行代码后,第HttpResponseMessage res = cons.PostAsJsonAsync("", product).Result;
行出现以下错误:
System.AggregateException:'发生一个或多个错误。 (响应状态代码不表示成功:500(内部服务器错误)。)'
HttpRequestException:响应状态代码未指示成功:500(内部服务器错误)。
我想问题是我如何将值发送到API以及API期望什么。我有这个数据预期的例子:
{
"":[{
"productId":"27795",
"amount":2,
"customerid":0
},{
"productId":"27796",
"amount":1,
"customerid":0
}],
"returnbasketid":true
}
我已经使用Postman进行了测试,并且工作正常,所以问题一定出在我的代码上。
https://pastebin.com/pZDehaaD这是我的Program.cs的完整示例。该API网址已被删除。
编辑:这是控制台应用程序发送的JSON:
而通过邮递员工作的JSON是这样的:
所以问题是我应该如何编写我的代码,以便正确配置要发送的JSON?
答案 0 :(得分:1)
您要将产品传递给API(这是上面的第一个Fiddler捕获)。
但是,如果我们查看所需的输入(上面的第二次Fiddlel捕获)以及“期望数据的示例”(灰色背景),则会看到一个对象,该对象包含一个(未命名)Products数组和一个名为“ returnbasketid”的字段“。
如果重新创建此对象,我们需要做什么。我们可以将此类称为“包装器”或“ MyRequestObject”或任何其他名称。名称并不重要。我会尝试这种形式的代码。
public class Wrapper
{
[JsonProperty("")] // rename json property to empty string - don't know if this will work
public List<Product> Products { get; set; } = new List<Product>();
public bool returnbasketid { get; set; }
}
然后使用cons.PostAsJsonAsync()调用将此包装器的实例而不是产品传递给
。问题是我们的包装器的Product数组有一个名称,而服务器需要一个没有名称的数组。我正在尝试重命名上面的数组。如果那很好。否则,我认为您将不得不自己创建json(Newtonsoft可以轻松实现),然后使用HttpClient的PostAsync(Uri,HttpContent)发布。