我在Visual Studio 2022中有两个项目的解决方案:
- 控制台应用程序 一个使用ASP创建的极简API。. NET Core Web API
API有一个简单的模型如下:
class Todo // This is the model
{
public int Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
应该表示一个小型数据库中的Todo项,类似于ASP. html中所示的教程。网络文档。API有POST
,PUT
和DELETE
方法
POST
方法如下所示:
// POST
app.MapPost("/todoitems", (Todo todo, TodoDb db) =>
{
db.Todos.Add(todo);
db.SaveChanges();
return Results.Created($"/todoitems/{todo.Id}", todo);
});
我决定使用同步调用来简化这一点。
控制台应用程序尝试使用API公开的POST
方法在数据库中添加Todo项。以下是我到目前为止所能做的,感谢Microsoft文档中的REST客户端教程:
using System;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Json;
namespace InteractWithTodoApi
{
class Program
{
private static readonly HttpClient client = new HttpClient();
private static string repoLink = "https://localhost:7157/todoitems";
private static async Task PostData()
{
JsonContent content = JsonContent.Create("{"id": 1, "Name": "Wash dishes", "IsComplete": true}", typeof(string));
HttpResponseMessage postTask = await client.PostAsync(repoLink, content);
Console.WriteLine(postTask.Content);
}
static async Task Main(string[] args)
{
await PostData();
}
}
}
然后我用本地主机启动API,一旦它启动并运行,我就执行控制台应用程序。然后我在https://localhost:PORT/todoitems
下刷新浏览器中的API。
刷新浏览器后,我希望看到一个新条目对应:
{ "Id": 1, "Name": "Wash dishes", "IsComplete": true }"
控制台应用程序没有崩溃并运行到完成,但是当我刷新浏览器时,我看到我的待办事项列表仍然是空的:[]
.
我在这里做错了什么?
在与基于json的API交互时,指定标头似乎很重要。在使用System.Net.Http
- 全局设置,例如:
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
- 每个POST请求设置如下:
string JsonString = "{"name": "Wash dishes", "isComplete": true}";
StringContent content = new StringContent(JsonString, Encoding.UTF8, "application/json");
System.Net.Http
默认不是application/json
。它似乎是另一种基于文本的值。