#angular #asp.net-core #web
Вопрос:
Серверная часть — СЕТЕВОЕ ЯДРО ASP 5. Интерфейс — Угловой 2. Логика заключается в простом поиске по списку в базе данных. Проблема, с которой я сталкиваюсь, возникает во время запроса PUT (также пытался отправить). Проблема заключается в следующем : 0: «Неожиданный символ, обнаруженный при анализе значения: Путь» (код состояния 400). Api работает правильно (проверено с postman), но когда я пытаюсь сделать запрос через приложение angular, я сталкиваюсь с этой проблемой. Примечание: Похоже, не достигает метода в контроллере. В чем, по-видимому, проблема ?
Спасибо.
Угловой:
TS Component:
searchBar = new FormControl('',[Validators.maxLength(50),Validators.required])
getSearchedJobs(){
console.log(this.searchBar.value)
this.informationService.getCompaniesSearchedByUser(this.searchBar.value).subscribe(response=>{
this.jobs = response;
});
}
HTML Component:
<form class="form-group row ml-2" (ngSubmit)="getSearchedJobs()">
<button type="submit" class="btn btn-primary">Search</button>
<div class="ml-2"><input type="search" [formControl]="searchBar" class="form-control"></div>
</form>
Service Component:
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
})
};
getCompaniesSearchedByUser(model: any) {
console.log(model);
return this.http.put(this.baseUrl "information/search-jobs-setbyusers/", model,this.httpOptions);
}
Seems that if I don't add the content-type will give me Status Code Error 415
сеть:
Controller:
[HttpPut("search-jobs-setbyusers")]
public async Task<ActionResult<IEnumerable<GetCompaniesJobsLinksDto>>>SearchJobs([FromBody]SearchJobsDto searchJobsDto)
{
if(String.IsNullOrEmpty(searchJobsDto.SearchJob))
{
return NotFound("Please try to add something in the search bar !");
}
var jobs = await _informationRepository.SearchJob(searchJobsDto.SearchJob.ToLower());
if(!jobs.Any())
{
return NotFound("Nothing was found !");
}
return Ok(jobs);
}
}
SearchJobsDto: (contains only a string)
[MaxLength(50)]
public string SearchJob { get; set; }
Комментарии:
1. Похоже, не удается преобразовать строку в значение Json. Возможно, вы не передаете JSON в DeserializeObject.
2. Но что я могу сделать в этом случае ? потому что я попытался передать в угловое приложение JSON.stringify(модель), и теперь я получаю следующую ошибку: 0: «Ошибка преобразования значения»о» в тип » API.DTOs. InformationDTOs.SearchJobsDto'(Код состояния 400) (значение «о» — это то, что я добавил во входные данные) Почему именно в этом случае не удается преобразовать объект ?
3. Проблема была исправлена, вы можете посмотреть в последних комментариях. Я добавил решение. Спасибо. @Шива Макани
Ответ №1:
Для размещения HTTP требуется, чтобы вы включили идентификатор в URI:
information/search-jobs-setbyusers/{id}
(См. также https://restfulapi.net/rest-put-vs-post/)
Итак, вы можете попробовать HTTP-СООБЩЕНИЕ.
Стоит попробовать следующее:
export class SearchJobsDto
{
public SearchJob: string;
}
getCompaniesSearchedByUser(searchString: string)
{
let model: SearchJobsDto = { searchString: SearchJob }
return this.http.post(this.baseUrl "information/search-jobs-setbyusers/", model, this.httpOptions);
}
и метод контроллера в виде ПОСТА:
[HttpPost("search-jobs-setbyusers")]
public async
Task<ActionResult<IEnumerable<GetCompaniesJobsLinksDto>>>SearchJobs(
[FromBody]SearchJobsDto searchJobsDto)
{
...
}
Ошибка, скорее всего, вызвана одним или обоими из них:
- Передача параметра любого типа для модели, который приведет к ошибке синтаксического анализа при разрешении привязки типа параметра к типу параметра модели в методе контроллера API. Лучше всего использовать явный тип для параметра, переданного в модели POST/PUT.
- Не включая идентификатор для HTTP-запроса с параметром полезной нагрузки модели.
Комментарии:
1. Похоже, проблема была отсюда: панель поиска = новый FormControl («, [Валидаторы.Максимальная длина(50), требуются валидаторы]). Имея только один ввод, а не групповую форму, и чем напрямую отправлять значение, подобное этому: this.SearchBar.value, не удается преобразовать его в мой класс SearchJobsDto (NET). Таким образом, мое решение в основном такое же, как и у вас, но я вложил логику в компонент, например: пусть model = SearchJobs() (поисковые задания-это класс, содержащий панель поиска), а затем model.SearchBar = this.SearchBar.значение и после того, как я отправил его в свои службы. (this.informationService.getcompaniessearchedпользователь(модель).sub()
2. Поисковые задания DTO в приложении Angular (модель). В этом случае должен быть объявлен как класс, а не как интерфейс. В качестве краткой заметки поработайте также с ПОЧТОЙ. Проблема была исправлена. Спасибо. @Эндрю Халил