Я создаю приложение Angular2 + с .NET RESTful API. Как только я нажимаю кнопку «Сохранить» после добавления элементов рецепта, я получаю сообщение об ошибке в консоли. Кажется, что Post () работает неправильно.
Компонент Add-Recipe (.html)
<h1>Add a Recipe</h1>
<form class = "form-inline">
<label class = "sr-only" for = "recipeTitle">Recipes</label>
<div class = "input-group mb-2 mr-sm-2">
<input type = "text" class = "form-control" id = "recipeTitle" name = "recipeTitle" placeholder = "Recipe Title" [(ngModel)] = "title">
</div>
<label class = "sr-only" for = "count">Ingredient</label>
<input type = "number" class = "form-control mb-2 mr-sm-2" id = "count" name = "count" placeholder = "Count" [(ngModel)] = "count">
<label class = "sr-only" for = "ingredient">Recipes</label>
<div class = "input-group mb-2 mr-sm-2">
<input type = "text" class = "form-control" id = "ingredient" name = "ingredient" placeholder = "Ingredient" [(ngModel)] = "ingredient">
</div>
<p>the count: {{ itemCount }}</p>
<input type = "submit" class = "btn btn-primary mb-2" value = "Add" (click) = "addIngredient()">
</form>
<h2>My Ingredients</h2>
<ul class = "list-group">
<li class = "list-group-item" *ngFor = "let ingredient of ingredientsArray">
<span class = "badge">{{ ingredient.count }}</span> {{ ingredient.ingredient }}
</li>
</ul>
<button type = "button" class = "btn btn-primary" (click) = "saveRecipe()">Save</button>
<button type = "button" class = "btn btn-danger">Cancel</button>
Добавить код рецепта позади
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-add-recipe',
templateUrl: './add-recipe.component.html',
styleUrls: ['./add-recipe.component.css']
})
export class AddRecipeComponent implements OnInit {
itemCount: number;
count: number;
ingredient: string = '';
title: string = '';
ingredientsArray = [];
constructor(private http: HttpClient) { }
ngOnInit() {
this.itemCount = this.ingredientsArray.length;
}
addIngredient() {
this.ingredientsArray.push({ count: this.count, ingredient: this.ingredient });
this.ingredient = '';
this.itemCount = this.ingredientsArray.length;
this.count = null;
}
saveRecipe() {
this.http.post('api/recipes',
{ title: this.title, ingredients: this.ingredientsArray, itemCount: this.itemCount })
.subscribe((res: Response) => {
console.info('should be saved');
});
}
}
Контроллер
[HttpPost]
public IActionResult Post(string title, List<IngredientsController> ingredients)
{
return Ok();
}
Кажется, что все настроено так, как должно быть, но я получаю огромную ошибку в консоли, как будто она не достигает. Сообщение об ошибке говорит
message: "Http failure response for https://localhost:5001/api/recipes: 404 Not Found"
ингредиенты.
export class Ingredient {
count: number;
ingredient: string;
}
Разве мне не нужно создавать страницу? Мне нужно создать какой-то компонент, который направляет на этот URL-адрес?
Я не вижу ничего в том, что вы опубликовали, что указывает на то, что у вас есть маршрут к серверу, это почти весь интерфейсный код.





Код состояния 404 обычно указывает, что URL-адрес, по которому вы пытаетесь попасть, не найден, и проблема не на стороне сервера, а на стороне клиента. Маршрут, который вы пытаетесь выбрать, - https: // локальный: 5001 / api / рецепты, я не думаю, что локальный хост должен иметь https в качестве протокола, localhost должен быть http. Поэтому из-за этого локальный хост не найден, вам следует изменить его на http: // локальный: 5001 / api / рецепты. Сообщите мне, если это сработает для вас.
Здесь есть несколько ошибок.
1) С Http Post все параметры должны идти как «одна» полезная нагрузка. Следовательно, вам необходимо создать специальный класс для каждого типа полезной нагрузки в вашем приложении и построить JSON в клиентском коде, чтобы он соответствовал ему. Например, в этом случае ваш класс будет следующим: -
public class Input
{
public string Title { get; set; }
/* Your code refers this to IngredientsController list,
* However it should be Ingrediends as you don't intend to create a list of actual controllers.
* Please check*/
public List<Ingredients> Ingredients { get; set; }
public int ItemCount { get; set; }
}
Обычно при использовании JSON по умолчанию используется регистр верблюда, но вы можете заставить его использовать паскальский регистр, если хотите, изменив форматировщик (просто чтобы убедиться, что вы в конечном итоге получите правильные имена полей JSON)
2) URL-адрес, который вы используете, - это «api / recipies», но в вашем маршруте вы, возможно, пропустили украшение URL-адреса через RouteName или RoutePrefix (если это маршрутизация на основе атрибутов). Если это маршрутизация на основе соглашений, убедитесь, что имя вашего контроллера на стороне сервера - «Рецепты», так как любая разница в маршруте не удастся. (Кстати, вы можете звонить контроллеру?
3) Не беспокойтесь о «https» и «http», это связано с тем, что у вас установлен и используется сертификат сервера (команда ng serve --ssl), и, следовательно, модуль angular http использует https вместо http.
Если это не помогает, опубликуйте код вашего контроллера (просто удалите частные и другие методы) и любые другие ошибки, которые у вас возникают.
1) Я добавил файл ингридиенты.ts. Разве вы не об этом имеете в виду? Вы правы насчет списка <>. Я этого не уловил. Я пытаюсь добавить другой тип, но, похоже, intellisense хочет добавить IngredientsController. Как я могу получить его из типовых ингредиентов?
Проверьте путь к импорту файла ингредиентов. Также вам необходимо настроить класс для входной полезной нагрузки
Готово и сделано. У меня был неправильный URL, как вы и сказали. Я установил два класса в контроллере.
Вы уверены, что конечная точка существует? Это то, что вам описывает 404-й.