如何从浏览器使用@PostMapping?

时间:2019-03-22 14:28:47

标签: java spring rest spring-mvc spring-data-jpa

我正在使用Spring开发一个简单的REST服务。我有一个实体和一个控制器。我的问题是我无法在浏览器中使用Post功能,而只能在终端上使用。 Get函数在浏览器和终端上都可以正常运行,而Post函数仅在终端上可以运行,但是我必须在浏览器中运行。

对于以下代码,如果我导航至:

  

http://localhost:8080/cities

结果正常,返回所有记录。

获取方法:

@RestController
public class CityController {

    ...

    @GetMapping(value = "/cities", produces = "application/json; charset=UTF-8")
    List<City> all() {
        return repository.findAll();
    }
}

对于Post方法,如果我写类似以下内容,则只能在终端上工作:

  

卷曲-X POST本地主机:8080 / cities -H'内容类型:应用程序/ json'   -d'{“ name”:“ test”,“ state”:“ test”}'

结果正常,创建记录。

但是,如果我尝试从浏览器中添加以下内容的新记录:

  

http://localhost:8080/cities?name=test&state=test

什么也没有发生,也没有错误发生。

发布方法:

@PostMapping(path = "/cities", consumes = "application/json", produces = "application/json")
City newCity(@RequestBody City city) {
    return repository.save(city);
}

实体:

@Entity
public class City {

    @Id @GeneratedValue(strategy=GenerationType.AUTO) Long id;
    private String name;
    private String state;

    public City() {
    }

    public City(String name, String state) {
        this.name = name;
        this.state = state;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

}

1 个答案:

答案 0 :(得分:0)

在浏览器中键入http://localhost:8080/cities?name=test&state=test仍将以GET的形式发送。

要以POST的身份发送,您可以选择以下几种方式:

  1. 使用其他人提到的浏览器插件。
  2. 创建HTML表单。
  3. 使用JavaScript。

选项1非常适合调试和测试,但不适用于生产质量的网站。您不能合理地期望访问者安装或使用浏览器加载项与您的网站进行交互。

选项2是最传统的设计。您需要从应用程序提供HTML文件(它可以是静态HTML文件,也可以使用模板框架,例如Thmyeleaf或Freemarker)。 HTML将需要配置为使用POST的{​​{3}}并将其指向端点。请记住,您的端点将需要接受表单编码的数据,而不仅仅是JSON。

选项3可以通过多种方式实现。您可以拥有一个使用嵌入式JavaScript调用端点的HTML文件,也可以使用Angular或React之类的框架。

很多选择,并且很难知道哪一个是最好的,而又不知道您到底想完成什么。