控制台应用程序不张贴到极简主义ASP.. NET核心API



我在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,PUTDELETE方法

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

时,似乎有两种方法可以做到这一点
  1. 全局设置,例如:
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
  1. 每个POST请求设置如下:
string JsonString = "{"name": "Wash dishes", "isComplete": true}";
StringContent content = new StringContent(JsonString, Encoding.UTF8, "application/json");

System.Net.Http默认不是application/json。它似乎是另一种基于文本的值。

最新更新