如果您想了解邮递员返回空的Json结果webapi的相关知识,那么本文是一篇不可错过的文章,我们将对邮递员postman进行全面详尽的解释,并且为您提供关于.netWebAPI返回xml、json格式
如果您想了解邮递员返回空的 Json 结果 web api的相关知识,那么本文是一篇不可错过的文章,我们将对邮递员postman进行全面详尽的解释,并且为您提供关于.net WebAPI返回xml、json格式、Asp-Net-Core开发笔记:WebApi开发实践WebApi接口返回json对象出现套娃递归问题、ASP.NET Core Web API提交表单具有文件和文本字段错误 为什么邮递员要求使用有效的Contant Type标头不起作用?如何通过邮递员发出POST API请求、asp.net-mvc-4 – .NET Web API Post Action返回空JSON的有价值的信息。
本文目录一览:- 邮递员返回空的 Json 结果 web api(邮递员postman)
- .net WebAPI返回xml、json格式
- Asp-Net-Core开发笔记:WebApi开发实践WebApi接口返回json对象出现套娃递归问题
- ASP.NET Core Web API提交表单具有文件和文本字段错误 为什么邮递员要求使用有效的Contant Type标头不起作用?如何通过邮递员发出POST API请求
- asp.net-mvc-4 – .NET Web API Post Action返回空JSON
邮递员返回空的 Json 结果 web api(邮递员postman)
-
检查文件名Employee.json 而不是employee.json 应该与控制器中的代码相同。
-
设置
Employee
模型如下
public class Employee
{
public Employee(int id,string firstname,string lastname)
{
this.Id = id;
this.FirstName = firstname;
this.LastName = lastname;
}
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
控制器代码
[Route("api/[controller]")]
[ApiController]
public class EmployeeController : ControllerBase
{
public JsonResult Get()
{
var jsonFile = System.IO.File.ReadAllText(@"D:\Users\Employee.json");
List<Employee> employee = JsonConvert.DeserializeObject<List<Employee>>(jsonFile);
//return new JsonResult(new Employee(1,"Toyota","Aygo"));
return new JsonResult(employee);
}
}
结果
.net WebAPI返回xml、json格式
WebAPI返回xml、json格式简单示例
using System.Net.Http.Formatting;
public class TestController : ApiController
{
{
new Student { Name="张三",Age=25,Weight=153.5M },
new Student { Name="李四",Age=18,Weight=110.5M },
new Student { Name="王五",Age=23,Weight=126.5M }
};
[HttpGet]
[Route("api/Test/GetDataForXML")]
public HttpResponseMessage GetDataForXML(string date)
{
HttpResponseMessage result = Request.CreateResponse<List<Student>>(HttpStatusCode.OK, list, Configuration.Formatters.XmlFormatter);
return result;
}
[HttpPost]
[Route("api/Test/PostDataForXML")]
public HttpResponseMessage PostDataForXML([FromBody]string date)
{
HttpResponseMessage result = Request.CreateResponse<List<Student>>(HttpStatusCode.OK, list, Configuration.Formatters.XmlFormatter);
return result;
}
[HttpGet]
[Route("api/Test/GetDataForJSON")]
public HttpResponseMessage GetDataForJSON(object date)
{
HttpResponseMessage result = Request.CreateResponse<List<Student>>(HttpStatusCode.OK, list, Configuration.Formatters.JsonFormatter);
return result;
}
}
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public decimal Weight { get; set; }
}
Asp-Net-Core开发笔记:WebApi开发实践WebApi接口返回json对象出现套娃递归问题
前言
看了下推送记录,一个月前,OK,我又变成月更了o(╯□╰)o,这绝对不行![○・`Д´・ ○]
所以今天来更新了
其实不是我懒得更新或者是太忙,其实是最近在写一篇很长的博客,一直没写完( Ĭ ^ Ĭ )
好吧,先进入正题……
有一个关于WebApi序列化的问题,跟设计有关,但在涉及到关联字段的时候经常会遇到。
实体类
先看看实体类定义,限于篇幅,只保留几个关键字段。
public class CrawlTask : EntityBase {
/// <summary>
/// 爬虫名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 创建这个爬虫的用户
/// </summary>
public User User { get; set; }
/// <summary>
/// 用户ID
/// </summary>
public string? UserId { get; set; }
}
用户实体类:
public class User : EntityBase {
/// <summary>
/// 用户名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 用户创建的爬虫
/// </summary>
public List<CrawlTask> CrawlTasks { get; set; }
}
接口
然后接口这样写:
/// <summary>
/// 获取用户创建的全部爬虫
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult<List<CrawlTask>> GetAll() {
var user = _authService.GetUser(User.Identity?.Name);
return user.CrawlTasks;
}
然后请求这个接口,我们期望的数据是:
[
{
"name": "爬虫名称",
"user": {
"name": "用户名"
},
"userId": "0f3d4b2f-3b4e-4d08-8f4c-0009a316f041",
"id": "4d52d83b-f3ec-47c6-ab26-e241c09c14d1"
}
]
报错
但事实是直接报错:
System.Text.Json.JsonException: A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32. Consider using ReferenceHandler.Preserve on JsonSerializerOptions to support cycles.
Path: $.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.Name.
很明显,返回的对象套娃递归了。
注意那个Path:$.User.CrawlTasks.User.CrawlTasks.User.Crawl...
,我们上面期望的json数据是:
{
"name": "test crawl123",
"user": {
"name": "string"
},
"userId": "0f3d4b2f-3b4e-4d08-8f4c-0009a316f041",
"id": "4d52d83b-f3ec-47c6-ab26-e241c09c14d1"
}
即Crawl
对象下的User
只有Name
属性,不要把CrawlTasks
列表也显示出来,但程序它不知道啊,User
里有CrawlTasks
,然后CrawlTasks
里面又有User
,这就陷入一个套娃递归了……
初步解决
很明显,这根设计和数据获取方式有问题,可以通过换个查询方式来避免,比如:
[HttpGet]
public ActionResult<List<CrawlTask>> GetAll() {
return _crawlRepo
.Where(a => a.UserId == User.Identity.Name)
.ToList();
}
因为这里没有请求Crawl
的导航属性User
,所以不会读取User
对象的信息,出现的结果是这样:
[
{
"name": "test crawl123",
"user": null,
"userId": "0f3d4b2f-3b4e-4d08-8f4c-0009a316f041",
"id": "4d52d83b-f3ec-47c6-ab26-e241c09c14d1"
}
]
可以看到User
对象的值是null,对于接口来说已经够用了,毕竟这是获取当前用户的所有爬虫,所有爬虫的user属性都是同一个,没必要重复啦。
不过即使把User
对象加上也是完全没问题的,这里改一下接口看一下效果:
[HttpGet]
public ActionResult<List<CrawlTask>> GetAll() {
return _crawlRepo.Select
.Where(a => a.UserId == User.Identity.Name)
.Include(a => a.User) // 添加了这行代码,请求关联对象
.ToList();
}
返回的结果:
[
{
"name": "test crawl123",
"user": {
"name": "string",
"crawlTasks": null,
"id": "0f3d4b2f-3b4e-4d08-8f4c-0009a316f041"
},
"userId": "0f3d4b2f-3b4e-4d08-8f4c-0009a316f041",
"id": "4d52d83b-f3ec-47c6-ab26-e241c09c14d1"
}
]
可以看到,返回的Crawl
对象中,User
对象里的crawlTasks
属性是空的,因为我们前面加的那行代码:.Include(a => a.User)
,Freesql还支持进一步查询User
的导航属性crawlTasks
,但需要置顶Include
的then
参数,配置套娃查询……
继续!
那有没有什么办法是不改动接口代码的情况下,解决接口套娃的问题?
答案肯定有啦
这就要用NewtonsoftJson
了~
首先安装Microsoft.AspNetCore.Mvc.NewtonsoftJson
这个nuget包
然后在服务配置里面添加代码
services.AddControllersWithViews()
.AddNewtonsoftJson(options => {
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});
然后再请求接口,返回的结果就跟上面的一样啦~
会导致套娃递归的属性直接变成null~
PS:这个代码的作用就是把WebApi默认的json序列化器从System.Text.Json
改成NewtonsoftJson
,并且配置处理套娃递归的方式为忽略~
参考文档
- https://stackoverflow.com/questions/59199593/net-core-3-0-possible-object-cycle-was-detected-which-is-not-supported
ASP.NET Core Web API提交表单具有文件和文本字段错误 为什么邮递员要求使用有效的Contant Type标头不起作用?如何通过邮递员发出POST API请求
您可以设置
[DataType(DataType.Upload)] public IFormFile file{ get; set; }
在您的模型中
, @Purushothaman建议添加[FromForm]
是有效且简单的解决方案,只要您知道自己在做什么。如果您的规范说您希望端点接受multipart/form-data
,否则我将选择使用application/json
的端点。
请记住,大多数API在application/json
而非form data
上运行。使用form-data
时,这可能会导致一些集成问题。
为什么邮递员要求使用有效的Contant Type标头不起作用?
设置application/json
没关系,因为它被覆盖了。按照documentation form-data和documentation auto-generated-headers。因此,您要发送的Content-type标头是Content Type multipart/form-data
而不是application/json
,这会导致415
响应。
如何通过邮递员发出POST API请求
如果您不想使用[FormData]并重新编译服务器代码,则在Postman中更改设置并不难。
首先转到POST请求中的正文,找到原始选项,然后选择右侧它旁边的JSON(application / json)下拉菜单。以json格式粘贴您的数据。
asp.net-mvc-4 – .NET Web API Post Action返回空JSON
public HttpResponseMessage<lightUserInfo> Post(logonModel model) { if (ModelState.IsValid) { if (Membership.ValidateUser(model.UserName,model.Password)) { MembershipUser user = Membership.GetUser(model.UserName); var userinfo = new lightUserInfo(user); return new HttpResponseMessage<lightUserInfo>(userinfo); } } }
我可以看到对象userinfo填充正常,这将向浏览器返回200 OK …但内容只是空的json {}
这是CoffeeScript中的客户端ajax
$.ajax url: Meshable.rooturl + "/api/authentication" data: JSON.stringify authenticationDetails dataType: "json" type: "POST" contentType: 'application/json; charset=utf-8' error: (e) -> success: (data) -> #data comes in as empty {}
解决方法
using System.Runtime.Serialization;
然后标记这样的类
[DataContract] public class UserInfo { [DataMember] public string mystr {get; set;} }
今天关于邮递员返回空的 Json 结果 web api和邮递员postman的分享就到这里,希望大家有所收获,若想了解更多关于.net WebAPI返回xml、json格式、Asp-Net-Core开发笔记:WebApi开发实践WebApi接口返回json对象出现套娃递归问题、ASP.NET Core Web API提交表单具有文件和文本字段错误 为什么邮递员要求使用有效的Contant Type标头不起作用?如何通过邮递员发出POST API请求、asp.net-mvc-4 – .NET Web API Post Action返回空JSON等相关知识,可以在本站进行查询。
本文标签: