【问题标题】:Angular 5 + Spring Boot post method doesn't workAngular 5 + Spring Boot post 方法不起作用
【发布时间】:2018-02-11 10:32:51
【问题描述】:

我使用 Angular 5 + Spring Boot。问题是我无法通过 post 方法将信息发送到我的休息控制器。 我没有从客户端或服务器端收到任何错误。 在代码下方,您将看到我使 get 方法正常工作。 让我为我的英语道歉。

弹簧实体 { Dish }

@Entity
@Table(name = "DISHES")
@Data
public class Dish implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private Long id;

    @Column(name = "NAME", unique = true)
    @NotNull(message = "Ястието трябва да има име.")
    @Size(min = 3, max = 30, message = "Името на ястието трябва да е между 3 и 30 символа.")
    private String name;

    @Column(name = "DESCRIPTION")
    @NotNull(message = "Описанието на ястието не може да е празно.")
    @Size(min = 3, max = 300, message = "Описанието на ястието трябва да е между 3 и 30 символа.")
    private String description;

    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL ,mappedBy = "dish")
    @JsonBackReference
    private List<DishCounter> dishCounters;
}

角度实体 {Dish}

export class Dish {

    constructor(public id?: number, public name?: string, public description?: string) {

    }
}

Spring Rest 控制器 {Dish}

@CrossOrigin(origins = "http://localhost:4200")
@RestController
@RequestMapping("/dish")
public class DishRestController {

    private static final Logger logger = LoggerFactory.getLogger(DishRestController.class);

    private final DishService dishService;

    @Autowired
    public DishRestController(final DishService dishService) {
        this.dishService = dishService;
    }

    @GetMapping("/all")
    public ResponseEntity<List<Dish>> getAllDishes() {
        logger.info("Rest controller find all dishes");
        List<Dish> dishes = dishService.getAllDishes();

        return ResponseEntity.status(HttpStatus.OK).body(dishes);
    }

    @PostMapping("/save")
    public ResponseEntity<Void> saveDish(@RequestBody Dish dish) {
        dishService.saveDish(dish);
        return new ResponseEntity<>(HttpStatus.OK);
    }
}

和 Angular 发布方法

 save(dish: Dish): Observable<Dish> {
        let result: Observable<Dish>;

        result = this.http.post(this.saveDishUrl, dish)
            .map((resp => {
                console.log(resp);
                return resp;
            }))
            .catch(e => {
                console.log(e);
                return Observable.throw(e);
            });

        console.log(result);

        return result;
    }

【问题讨论】:

  • 很难相信客户端和服务器端都没有任何错误。特别要仔细检查控制台和网络选项卡,检查请求是否发送以及响应是什么。
  • 您的 Angular 发布方法看起来很奇怪。不要在这里返回任何东西。相反 ...map((resp:Response) => resp.json()) 应该可以解决问题。并删除 catch 子句中的“return”。
  • 我是 Angular 的新手。我是这样写的:return this.http.post(this.saveDishUrl, dish) .map((res: Response) =&gt; res.json()) .catch((error: any) =&gt; Observable.throw(error.json().error || 'Server error')); 但还是没有。我尝试使用 PostMan 工具将数据发送到我的 RestController,一切都成功通过了,但是使用 angular 我没有成功...:/
  • 你在哪里调用订阅帖子功能?我在这里看不到。由于 http post 返回一个 observable,您必须订阅它才能进行调用。
  • @DanR。谢谢 !!!这就是问题所在。将您的评论发布到我可以访问它。

标签: java angular spring-boot


【解决方案1】:

你在哪里调用 subscribe 的 post 功能?我在这里看不到。由于 http post 返回一个 observable,您必须订阅它才能进行调用。

http.post(....).subscribe(response => <DO SOMETHING WITH IT>);

【讨论】:

  • post 函数或调用 Angular 服务的函数(然后调用 Api)谢谢!!!
【解决方案2】:

这可能不是您代码中的所有错误,但这是我注意到的。

您的 Java @PostMapping 没有指定它应该接收什么以及它应该产生什么作为回报。

@PostMapping(value = "save", consumes = MediaType.APPLICATION_JSON_VALUE, 
    produces = MediaType.APPLICATION_JSON_VALUE)

对于 Angular 5,您使用的是 Angular 4 服务语法,我认为他们在 5 上更改了它。

【讨论】:

  • 感谢您的修复,但问题仍然存在:/ 我是 Angular 的新手,现在我写 return this.http.post(this.saveDishUrl, dish, {headers: this.headers}) .map((res: Response) =&gt; res.json()) .catch((error: any) =&gt; Observable.throw(error.json().error || 'Server error')); 其中 headers = new HttpHeaders({'Content-Type': 'application/json'});saveDishUrl = 'http://localhost:8080/dish/save';
  • @ДжулиянОвчаров 你能用Postman之类的东西成功地访问REST端点吗?这样我们就可以排除Java问题了。
  • 对我来说,Angular 服务调用看起来不错,除了一件事。 Spring API 有任何安全性吗? IE。 ClientDetailsServiceConfigurer 要求您发送带有所有请求的 Authorization 标头?
  • 我还没有使用 subscribe() 来发送请求,现在一切都很好,感谢您的时间。 :)
  • 不用担心。您可能想请@Dan R 发表他的评论作为答案,以便您可以访问它。
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 2017-08-10
  • 2018-01-24
  • 1970-01-01
  • 2021-08-15
  • 2015-09-30
  • 1970-01-01
相关资源
最近更新 更多