GVKun编程网logo

邮递员返回空的 Json 结果 web api(邮递员postman)

10

如果您想了解邮递员返回空的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)

邮递员返回空的 Json 结果 web api(邮递员postman)

  1. 检查文件名Employee.json 而不是employee.json 应该与控制器中的代码相同。

    enter image description here

  2. 设置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);
    }
}

结果 enter image description here

.net WebAPI返回xml、json格式

.net WebAPI返回xml、json格式

 

WebAPI返回xml、json格式简单示例

using System.Net.Http.Formatting;
public class TestController : ApiController {
        public static List<Student> list = new List<Student>
{ 
            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对象出现套娃递归问题

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,但需要置顶Includethen参数,配置套娃查询……

继续!

那有没有什么办法是不改动接口代码的情况下,解决接口套娃的问题?

答案肯定有啦

这就要用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请求

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格式粘贴您的数据。 enter image description here

asp.net-mvc-4 – .NET Web API Post Action返回空JSON

asp.net-mvc-4 – .NET Web API Post Action返回空JSON

我有一个继承自ControllerApi的控制器(MVC 4)

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 {}

解决方法

不要认为POCO是最简单的情况,绝对可以毫无困难地序列化.你必须正确地标记它.包括

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等相关知识,可以在本站进行查询。

本文标签: