ЯДРО СЕТИ ASP с УГЛОВЫМ -«Неожиданный символ, встречающийся при анализе значения: a. Путь», строка 0, позиция 0.» / Ошибка во время запроса PUT

#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)
{
   ...
}
 

Ошибка, скорее всего, вызвана одним или обоими из них:

  1. Передача параметра любого типа для модели, который приведет к ошибке синтаксического анализа при разрешении привязки типа параметра к типу параметра модели в методе контроллера API. Лучше всего использовать явный тип для параметра, переданного в модели POST/PUT.
  2. Не включая идентификатор для HTTP-запроса с параметром полезной нагрузки модели.

Комментарии:

1. Похоже, проблема была отсюда: панель поиска = новый FormControl («, [Валидаторы.Максимальная длина(50), требуются валидаторы]). Имея только один ввод, а не групповую форму, и чем напрямую отправлять значение, подобное этому: this.SearchBar.value, не удается преобразовать его в мой класс SearchJobsDto (NET). Таким образом, мое решение в основном такое же, как и у вас, но я вложил логику в компонент, например: пусть model = SearchJobs() (поисковые задания-это класс, содержащий панель поиска), а затем model.SearchBar = this.SearchBar.значение и после того, как я отправил его в свои службы. (this.informationService.getcompaniessearchedпользователь(модель).sub()

2. Поисковые задания DTO в приложении Angular (модель). В этом случае должен быть объявлен как класс, а не как интерфейс. В качестве краткой заметки поработайте также с ПОЧТОЙ. Проблема была исправлена. Спасибо. @Эндрю Халил