#c# #asp.net-core #.net-core #postman #asp.net-core-webapi
#c# #asp.net-core #.net-ядро #почтальон #asp.net-core-webapi
Вопрос:
Я использую .NET 5.0.100-предварительный просмотр.8.20417.9, ASP.NET Веб-API Core 5, Entity Framework Core 5, SQL Server 2019, Postman v7.32.0.
Модель
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace shadow.DTO
{
public partial class TrustedPersonUserDTO
{
public string Fullname { get; set; }
public string AliasName { get; set; }
public string Email { get; set; }
public string PhoneNumber1 { get; set; }
public string PhoneNumber2 { get; set; }
public string PhoneNumber3 { get; set; }
public int? RelationshipId { get; set; }
public string About { get; set; }
public int? AvatarId { get; set; }
public DateTime? Created { get; set; }
public DateTime? Modified { get; set; }
// Id của user.
public string UserId { get; set; }
}
public partial class TrustedPersonUserDTO2
{
public string Fullname { get; set; }
public string AliasName { get; set; }
public string Email { get; set; }
public string PhoneNumber1 { get; set; }
public string PhoneNumber2 { get; set; }
public string PhoneNumber3 { get; set; }
public int? RelationshipId { get; set; }
public string About { get; set; }
public int? AvatarId { get; set; }
public DateTime? Created { get; set; }
public DateTime? Modified { get; set; }
// Id của user.
public string UserId { get; set; }
public IFormFile file { get; set; }
}
}
и контроллер
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using shadow.Data;
using shadow.DTO;
using shadow.Models;
using shadow.Services;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace shadow.Controllers
{
[Route("[controller]")]
[ApiController]
public class UserTrustedPersonController : ControllerBase
{
private IUserService _userService;
private IMailService _mailService;
private IConfiguration _configuration;
private ApplicationDbContext _db;
public static IWebHostEnvironment _environment;
public UserTrustedPersonController(IUserService userService, IMailService mailService, IConfiguration configuration, ApplicationDbContext db, IWebHostEnvironment environment)
{
_userService = userService;
_mailService = mailService;
_configuration = configuration;
_db = db;
_environment = environment;
}
/// <summary>
/// Thêm mới người ủy thác kèm Relationship.
/// </summary>
/// <param name="trustedPersonUserDTO"></param>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<ActionResult<TrustedPersonUserDTO>> AddUserTrustedPersons(TrustedPersonUserDTO trustedPersonUserDTO)
{
var item = new TrustedPerson
{
Fullname = trustedPersonUserDTO.Fullname,
About = trustedPersonUserDTO.About,
AliasName = trustedPersonUserDTO.AliasName,
AvatarId = trustedPersonUserDTO.AvatarId,
Created = DateTime.Now,
Email = trustedPersonUserDTO.Email,
PhoneNumber1 = trustedPersonUserDTO.PhoneNumber1,
PhoneNumber2 = trustedPersonUserDTO.PhoneNumber2,
PhoneNumber3 = trustedPersonUserDTO.PhoneNumber3,
RelationshipId = trustedPersonUserDTO.RelationshipId
};
_db.TrustedPeople.Add(item);
await _db.SaveChangesAsync();
UserTrustedPerson userTrustedPerson = new UserTrustedPerson();
userTrustedPerson.UserId = trustedPersonUserDTO.UserId;
userTrustedPerson.TrustedPersonId = item.Id;
_db.UserTrustedPeople.Add(userTrustedPerson);
await _db.SaveChangesAsync();
return Ok(userTrustedPerson);
}
/// <summary>
/// Thêm mới người ủy thác kèm Relationship.
/// </summary>
/// <param name="trustedPersonUserDTO"></param>
/// <returns></returns>
[HttpPost]
[Route("add")]
[Authorize]
public async Task<ActionResult<TrustedPersonUserDTO>> AddUserTrustedPersons2(TrustedPersonUserDTO2 trustedPersonUserDTO)
{
var item = new TrustedPerson
{
Fullname = trustedPersonUserDTO.Fullname,
About = trustedPersonUserDTO.About,
AliasName = trustedPersonUserDTO.AliasName,
AvatarId = trustedPersonUserDTO.AvatarId,
Created = DateTime.Now,
Email = trustedPersonUserDTO.Email,
PhoneNumber1 = trustedPersonUserDTO.PhoneNumber1,
PhoneNumber2 = trustedPersonUserDTO.PhoneNumber2,
PhoneNumber3 = trustedPersonUserDTO.PhoneNumber3,
RelationshipId = trustedPersonUserDTO.RelationshipId
};
_db.TrustedPeople.Add(item);
await _db.SaveChangesAsync();
await WriteFile(trustedPersonUserDTO.file);
UserTrustedPerson userTrustedPerson = new UserTrustedPerson();
userTrustedPerson.UserId = trustedPersonUserDTO.UserId;
userTrustedPerson.TrustedPersonId = item.Id;
_db.UserTrustedPeople.Add(userTrustedPerson);
await _db.SaveChangesAsync();
return Ok(userTrustedPerson);
}
public class FileUploadAPI
{
public IFormFile files { get; set; }
}
[HttpPost]
[Route("upload2")]
[Obsolete]
public async Task<string> Post(FileUploadAPI objFile)
{
try
{
if (objFile.files.Length > 0)
{
if (!Directory.Exists(_environment.WebRootPath "\Upload\"))
{
Directory.CreateDirectory(_environment.WebRootPath "\Upload\");
}
using (FileStream fileStream = System.IO.File.Create(_environment.WebRootPath "\Upload\" objFile.files.FileName))
{
objFile.files.CopyTo(fileStream);
fileStream.Flush();
return "\Upload\" objFile.files.FileName;
}
}
else
{
return "Failed";
}
}
catch (Exception ex)
{
return ex.Message.ToString();
}
}
// Upload file ảnh.
[HttpPost("upload", Name = "upload")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)]
public async Task<IActionResult> UploadFile(IFormFile file, CancellationToken cancellationToken)
{
if (CheckIfExcelFile(file))
{
await WriteFile(file);
}
else
{
return BadRequest(new { message = "Invalid file extension" });
}
return Ok();
}
/// <summary>
/// Method to check if file is excel file
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
private bool CheckIfExcelFile(IFormFile file)
{
var extension = "." file.FileName.Split('.')[file.FileName.Split('.').Length - 1];
return (extension == ".png" || extension == ".jpg" || extension == ".bmp" || extension == ".gif" || extension == ".tif"); // Change the extension based on your need
}
private async Task<bool> WriteFile(IFormFile file)
{
bool isSaveSuccess = false;
string fileName;
try
{
var extension = "." file.FileName.Split('.')[file.FileName.Split('.').Length - 1];
fileName = DateTime.Now.Ticks extension; //Create a new Name for the file due to security reasons.
var pathBuilt = Path.Combine(Directory.GetCurrentDirectory(), "Upload\files");
if (!Directory.Exists(pathBuilt))
{
Directory.CreateDirectory(pathBuilt);
}
var path = Path.Combine(Directory.GetCurrentDirectory(), "Upload\files", fileName);
using (var stream = new FileStream(path, FileMode.Create))
{
await file.CopyToAsync(stream);
}
isSaveSuccess = true;
}
catch (Exception e)
{
//log error
}
return isSaveSuccess;
}
}
}
Я вызываю POST
http://localhost:5002/UserTrustedPerson/add
ошибка
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.13",
"title": "Unsupported Media Type",
"status": 415,
"traceId": "00-a1fc92edfaf6884d8d74e30c21090e87-7acaa91089108e49-00"
}
Как вызвать POST RESTful API с файловыми и текстовыми полями успешно?
Комментарии:
1. попробуйте добавить [FromForm], чтобы указать, что файл из формы.
2. не могли бы вы показать значения заголовка из postman?
3. @Purushothaman Это работает, давайте опубликуем ваш ответ.
4. @lukaszberwid user-images.githubusercontent.com/1328316 /…
Ответ №1:
Вы можете установить [DataType(DataType.Upload)] public IFormFile file{ get; set; }
В вашей модели
Ответ №2:
Как предложил @Purushothaman, добавление [FromForm]
является допустимым и простым решением, если вы знаете, что делаете. Если в вашей спецификации указано, что вы хотите, чтобы конечная точка принимала, multipart/form-data
в противном случае я бы выбрал использование конечной точки application/json
.
Имейте в виду, что большинство API работают с application/json
не form data
. Это может вызвать некоторые проблемы с интеграцией при использовании form-data
.
Почему запросы Postman с допустимыми заголовками типа содержимого не работают?
Не имеет значения, что вы установили application/json
, поскольку оно перезаписывается. Согласно автоматически сгенерированным заголовкамформы документации-данные и документация. Таким образом, заголовок типа содержимого, который вы отправляете, является типом содержимого, multipart/form-data
не application/json
, и это вызывает 415
ответ.
Как отправлять запросы POST API с помощью Postman
Если вы не хотите использовать [FormData] и перекомпилировать серверный код, нетрудно изменить настройки в Postman.
Сначала перейдите к тексту внутри вашего запроса POST, найдите параметр raw и выберите JSON (application / json), раскрывающийся рядом с ним справа. Вставьте свои данные в формате json.
Комментарии:
1. спасибо, я попробую затем оставить отзыв. Можете ли вы сделать свой ответ более понятным