C# 如何在web api上显示Json对象?
我正在开发一个ASP.NET Web Api,但在如何向Api显示数据方面遇到了一个问题 为了解释我需要弄明白什么。在从Json文件访问对象之后,我相信我应该能够在api上显示这些对象 例如,无论我请求哪个字段,它都应该返回按该字段排序的结果。 现在我需要在不同的端口显示这些数据。比如说C# 如何在web api上显示Json对象?,c#,asp.net,json,asp.net-core,C#,Asp.net,Json,Asp.net Core,我正在开发一个ASP.NET Web Api,但在如何向Api显示数据方面遇到了一个问题 为了解释我需要弄明白什么。在从Json文件访问对象之后,我相信我应该能够在api上显示这些对象 例如,无论我请求哪个字段,它都应该返回按该字段排序的结果。 现在我需要在不同的端口显示这些数据。比如说 https://host:port/api/books 返回所有未排序的(Book1-Book13) https://host:port/api/books/id 返回按id排序的所有内容(Book1-Boo
- https://host:port/api/books 返回所有未排序的(Book1-Book13)
- https://host:port/api/books/id 返回按id排序的所有内容(Book1-Book13)
- https://host:port/api/books/id/1 返回id包含“1”且按id排序的所有(Book1,Book10-13)
BooksController.cs
[Route("api/[controller]")]
[ApiController]
public class BooksController : ControllerBase
{
[HttpGet]
public ActionResult GetAllBooks()
{
string[] books = { "book1", "book2", "book3" };
if (!books.Any())
return NotFound();
return Ok(books);
}
[HttpGet("id/{id}")]
public string GetBookById(int id)
{
return $"book: {id}";
}
[HttpGet("author/{author}")]
public string GetBookByAuthor(string author)
{
return $"author: {author}";
}
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
GetAllBooks();
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<TodoContext>(opt =>
opt.UseInMemoryDatabase("TodoList"));
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
public void GetAllBooks()
{
string _path = $"C:\\Users\\filip\\source\\repos\\NexerGroupApi\\NexerGroupApi\\books.json";
string jsonFromFile;
using (var reader = new StreamReader(_path))
{
jsonFromFile = reader.ReadToEnd();
}
var booksFromJsonFile = JsonConvert.DeserializeObject<List<NexerGroupApi.Book>>(jsonFromFile);
JArray bookArray = JArray.FromObject(booksFromJsonFile);
IList<Book> bookList= bookArray.Select(p => new Book
{
Id = (string)p["Id"],
Author = (string)p["Author"],
Title = (string)p["Title"],
Genre = (string)p["Genre"],
Price = (string)p["Price"],
Publish_date = (string)p["Publish_date"],
Description = (string)p["Description"]
}).ToList();
}
public class Book
{
public string Id { get; set; }
public string Author { get; set; }
public string Title { get; set; }
public string Genre { get; set; }
public string Price { get; set; }
public string Publish_date { get; set; }
public string Description { get; set; }
}
这是我的startup.cs
[Route("api/[controller]")]
[ApiController]
public class BooksController : ControllerBase
{
[HttpGet]
public ActionResult GetAllBooks()
{
string[] books = { "book1", "book2", "book3" };
if (!books.Any())
return NotFound();
return Ok(books);
}
[HttpGet("id/{id}")]
public string GetBookById(int id)
{
return $"book: {id}";
}
[HttpGet("author/{author}")]
public string GetBookByAuthor(string author)
{
return $"author: {author}";
}
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
GetAllBooks();
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<TodoContext>(opt =>
opt.UseInMemoryDatabase("TodoList"));
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
public void GetAllBooks()
{
string _path = $"C:\\Users\\filip\\source\\repos\\NexerGroupApi\\NexerGroupApi\\books.json";
string jsonFromFile;
using (var reader = new StreamReader(_path))
{
jsonFromFile = reader.ReadToEnd();
}
var booksFromJsonFile = JsonConvert.DeserializeObject<List<NexerGroupApi.Book>>(jsonFromFile);
JArray bookArray = JArray.FromObject(booksFromJsonFile);
IList<Book> bookList= bookArray.Select(p => new Book
{
Id = (string)p["Id"],
Author = (string)p["Author"],
Title = (string)p["Title"],
Genre = (string)p["Genre"],
Price = (string)p["Price"],
Publish_date = (string)p["Publish_date"],
Description = (string)p["Description"]
}).ToList();
}
public class Book
{
public string Id { get; set; }
public string Author { get; set; }
public string Title { get; set; }
public string Genre { get; set; }
public string Price { get; set; }
public string Publish_date { get; set; }
public string Description { get; set; }
}
公共类启动
{
公共启动(IConfiguration配置)
{
配置=配置;
GetAllBooks();
}
公共IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
services.AddDbContext(opt=>
选择使用MemoryDatabase(“TodoList”);
services.AddControllers();
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(端点=>
{
endpoints.MapControllers();
});
}
公共无效GetAllBooks()
{
字符串_path=$“C:\\Users\\filip\\source\\repos\\nexrgroupapi\\nexrgroupapi\\books.json”;
字符串jsonFromFile;
使用(var reader=newstreamreader(_path))
{
jsonFromFile=reader.ReadToEnd();
}
var booksFromJsonFile=JsonConvert.DeserializeObject(jsonFromFile);
JArray bookArray=JArray.FromObject(booksFromJsonFile);
IList bookList=bookArray.Select(p=>newbook
{
Id=(字符串)p[“Id”],
Author=(字符串)p[“Author”],
Title=(字符串)p[“Title”],
流派=(字符串)p[“流派”],
价格=(字符串)p[“价格”],
发布日期=(字符串)p[“发布日期”],
Description=(字符串)p[“Description”]
}).ToList();
}
公共课堂用书
{
公共字符串Id{get;set;}
公共字符串作者{get;set;}
公共字符串标题{get;set;}
公共字符串类型{get;set;}
公共字符串Price{get;set;}
公共字符串发布日期{get;set;}
公共字符串说明{get;set;}
}
我想知道我在哪里设置了我的GetAllBooks()
方法,这样我就可以在BooksController.cs
中访问它们,并能够从JSonfile中执行api/books/bookmanemfromJSonfile并显示特定对象及其所有内容,如id、作者、标题、流派等
我知道类
startup.cs
中我的IList图书列表
不起作用,出于某种原因,每个变量get的null值都不起作用。尽管不确定原因。正如错误所示,您有两条路径是不明确的[HttpGet({id}])
和[HttpGet({author}]]]
给定
点击api/books/1时,1
可能是作者或图书ID
考虑将author方法的路径更改为:
[HttpGet(“author/{author}”)]
因此,请求将按如下方式发送:
api/books/1
将调用GetBookById
api/books/author/jsmith
将调用GetBookByAuthor
编辑:添加列表筛选:
要从列表中查找书籍
,可以执行以下操作:
private readonly List<Book> _bookList; //populate this with books from json file
[HttpGet("{id}")]
public IActionResult GetBookById(int id)
{
var book = GetBookObjectById(id);
if(book is null) return NotFound();
return Ok(book);
}
private Book GetBookObjectById(int id)
{
return _bookList.FirstOrDefault(book => book.Id == id);
}
private Book GetBookObjectByAuthor(string author)
{
return _bookList.FirstOrDefault(book => book.Author == author);
}
private readonly List\u bookList;//使用json文件中的书籍填充此列表
[HttpGet(“{id}”)]
公共IActionResult GetBookById(内部id)
{
var book=GetBookObjectById(id);
如果(book为null),则返回NotFound();
返回Ok(书本);
}
私人书籍GetBookObjectById(int id)
{
返回_bookList.FirstOrDefault(book=>book.Id==Id);
}
私人书籍GetBookObjectByAuthor(字符串作者)
{
返回_bookList.FirstOrDefault(book=>book.Author==Author);
}
@mason好的,我现在正在看一些教程--我会更新我的问题,也许你可以回答这个问题?你不需要为每一本书设置一条单独的路线。你需要对路线进行结构化,以获得参数。检查。@mason好的,我已经检查了该链接和youtube视频。据我所知,我然后我做了例如[HttpGet(“{id}”)],然后我用这个方法循环我的书,然后如果我输入“api/book/2,它将检索id=2的书。它工作了吗,这样我就可以执行[HttpGet({author}”)]如果我有一个字符串作者,那么如果我使用api/books/authorname,我实际上会收到该作者的书?我编辑了这个问题,以向您展示我认为可行的方法。我的startup.cs中是否存在导致此错误代码的问题?这是您的路由定义。如错误所述,您的路由匹配多个端点。最有可能是y它很疯狂,因为它不知道对像/api/books/1
这样的URL点击哪个操作方法,它不知道1
是Id还是作者。对于GetBookByAuthor,您可以将其更改为[HttpGet(“Author/{Author}]
,然后希望按作者查找书籍的人将点击URL/api/books/author/Tom%20Clancy
,并将GetBookById更改为[HttpGet(“id/{id}”)]
,这样他们就可以点击URL/api/books/id/1
,这就很明确了