实现成功的Post()

时间:2018-06-25 20:05:36

标签: angular rest http

我正在使用.NET RESTful API构建Angular2 +应用程序。添加配方项目后单击“保存”后,控制台中将显示错误消息。似乎不是Post()正确。

添加配方组件(.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.log('should be saved');

      });
  }
}

控制器

[HttpPost]
        public IActionResult Post(string title, List<IngredientsController> ingredients)
        {
            return Ok();
        }

似乎一切都按照预期的方式进行了设置,但是我在控制台中遇到了一个巨大错误,好像没有达到。错误消息说

  

消息:“ http失败响应为   https://localhost:5001/api/recipes:找不到404”

ingredients.ts

export class Ingredient {
    count: number;
    ingredient: string;
  }

我还没有创建页面吗?我需要创建某种可以路由到该网址的组件吗?

2 个答案:

答案 0 :(得分:0)

404状态码通常表示未找到您要命中的url,问题不在服务器端,而是在客户端。您尝试访问的路由为https://localhost:5001/api/recipes,我认为本地主机不应该使用https作为协议,本地主机应该是http。因此,由于未找到本地主机,因此应将其更改为http://localhost:5001/api/recipes。让我知道这是否适合您。

答案 1 :(得分:0)

这里有多个错误点

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)您使用的网址是“ api / recipies”,但是在您的路由中,您可能错过了通过RouteName或RoutePrefix(如果这是基于属性的路由)来装饰网址。如果这是基于约定的路由,请确保您的服务器端控制器名称为“ Recipes”,因为路由中的任何差异都将失败。 (顺便说一下,您是否可以对控制器进行任何调用?

3)不必担心“ https”和“ http”,这是由于您已经安装并使用了服务器证书(ng serve --ssl命令),因此使用了角度http模块https,而不是http。

如果这无济于事,请发布您的控制器代码(只需删除私有方法和其他方法)以及任何其他错误。