ASP Core PatchDocument, возвращающий неверный ввод
Я хочу использовать JsonPatchDocument для обновления моделей, которые были изменены в Angular 6. К сожалению, я продолжаю получать ответ 400 Bad Request со следующим сообщением:
{"":["The input was not valid."]}
Теперь я не уверен, правильно ли я это делаю, но так настроен мой код:
Внешний интерфейс:
edit.ts class
onSubmit() {
this.testService.update(this.id, this.prepareFormModel())
.subscribe(res => console.info(res);
}
prepareFormModel() {
const formModel = this.testForm.value;
const retVal: any = {
title: formModel.title as string,
comment: formModel.comment ? formModel.comment : '' as string,
qualified: formModel.qualified as boolean
};
return retVal;
}
класс test.service.ts
constructor(private http: HttpClient) { }
update(id: string, value: any): Observable<any> {
return this.http.patch<any>('http://localhost:5001/api/test' + '/' + id, value);
}
в моем контроллере проекта ASP CORE
[HttpPatch("{id}")]
public async Task<IActionResult> UpdateModel(Guid id, [FromBody]JsonPatchDocument<TestModel> modelDocument)
{
return Ok();
}
Модель DTO
public class TestModel
{
public string Title { get; set; }
public string Comment { get; set; }
public bool Qualified { get; set; }
}
Любая идея относительно того, что я заполняю?
Обновление 1:
Я заметил, что патч httpclient отправляет только контент типа application/json. Глядя на некоторые примеры JsonPatchDocument, он, похоже, запрашивает тип application/json-patch+json.
1 ответ
Для вашего текущего кода, вы неправильно поняли JsonPatchDocument
который используется для точного описания того, как вы хотите изменить документ (например, заменить значение в поле другим значением) без необходимости также отправлять оставшиеся неизмененные значения.
Вы проходите prepareFormModel
вместо того, чтобы описывать, как вы хотите изменить formModel
,
Если вы хотите получить TestModel
прямо в UpdateModel
нужно удалить JsonPatchDocument
,
public async Task<IActionResult> UpdateModelWithOutJsonPatch(Guid id, [FromBody]TestModel modelDocument)
{
return Ok();
}
Если вы хотите реализовать JsonPatchDocument
который описан в патче JSON. В ASP.net Core вам нужно передать описание документа, для библиотеки путей json вы можете попробовать fast-json-patch
,
API
public async Task<IActionResult> UpdateModelWithJsonPatch(Guid id, [FromBody]JsonPatchDocument<TestModel> modelDocument) { return Ok(); }
установить пакет
npm install fast-json-patch --save
импортировать функции
import { compare } from 'fast-json-patch';
Сравните объекты и передавая eh jsonpatch объект.
export class FetchDataComponent {
public forecasts: WeatherForecast[];
constructor(http: HttpClient, @Inject('BASE_URL') baseUrl: string) {
const patch = compare(this.previousFormModel(), this.prepareFormModel());
http.patch<any>(baseUrl + 'api/SampleData/UpdateModelWithJsonPatch/1', patch).subscribe(result => {
console.log(result);
}, error => console.error(error));;
http.patch<any>(baseUrl + 'api/SampleData/UpdateModelWithOutJsonPatch/1', this.prepareFormModel()).subscribe(result => {
console.log(result);
}, error => console.error(error));;
}
previousFormModel() {
//const formModel = this.testForm.value;
const retVal: any = {
title: "t2" as string,
comment: "c2" as string,
qualified: false as boolean
};
return retVal;
}
prepareFormModel() { //const formModel = this.testForm.value;
const retVal: any = {
title: "t1" as string,
comment: "c1" as string,
qualified: true as boolean
};
return retVal;
}
}
Примечание для JsonPatch
, вам нужно будет реализовать что-то вроде ниже, чтобы получить TestModel
[Route("api/[controller]")]
public class PersonController : Controller
{
private readonly Person _defaultPerson = new Person
{
FirstName = "Jim",
LastName = "Smith"
};
[HttpPatch("update")]
public Person Patch([FromBody]JsonPatchDocument<Person> personPatch)
{
personPatch.ApplyTo(_defaultPerson);
return _defaultPerson;
}
}