java - 带有 JAX-RX 的 REST API 从 jsp 页面中的表单发送和接收已解析的 JSON

标签 java json rest jsp jersey

我正在尝试在我的项目的 jsp 页面中创建一个表单,该表单将发送创建 CD 对象所需的信息。我知道这适用于 JSON,因为当我使用名为 postman 的 Google 插件时,我可以使用 json 发出发布请求并将新 cd 添加到所有 cd 的列表中。

虽然我需要制作一个 GUI 客户端,它可以使用 json 但显示解析的信息。我将发布一些类(class)。我已经搜索了该站点,但在这里找不到任何可以真正帮助我的东西。我收到不受支持的媒体类型错误...我想是因为我需要在发送数据之前以某种方式解析为 json?

@Path("/cd")
public class CDResources {

    CDService c = new CDService();
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public CD addCD(CD cd)
    {
        return c.addCD(cd);
    }

这是表格

<form action="webapi/cd/" method="post">
        <p>
            Artist : <input type="text" name="artist" />
        </p>

                <p>
            Artist : <input type="number" name="numberOfTracks" />
        </p>
                <p>
            Artist : <input type="text" name="title" />
        </p>

        <input type="submit" value="Submit" />
    </form>

光盘类

package Assignment.crud.model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class CD {

    String title;
    int numberOfTracks;
    String artist;
    long id;


    public CD() {

    }
    public CD(long id,String title,String artist,int numberOfTracks) {
        super();
        this.title = title;
        this.numberOfTracks = numberOfTracks;
        this.artist = artist;
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public int getNumberOfTracks() {
        return numberOfTracks;
    }
    public void setNumberOfTracks(int numberOfTracks) {
        this.numberOfTracks = numberOfTracks;
    }
    public String getArtist() {
        return artist;
    }
    public void setArtist(String artist) {
        this.artist = artist;
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }


}

光盘服务类

package Assignment.crud.service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import Assignment.crud.database.DatabaseClass;
import Assignment.crud.model.CD;

public class CDService {

    private Map<Long, CD> cds = DatabaseClass.getCDs();

    public CDService()
    {
        cds.put(1L, new CD(1,"Fleet Foxes","Helplessness Blues",10));
        cds.put(2L, new CD(2,"Van Morrison","Tupelo Honey",12));

    }
    public List<CD> getAllCDs()
    {   
        return new ArrayList<CD>(cds.values()); 
    }

    public CD getCD(long id)
    {   
        return cds.get(id); 
    }

    public CD addCD(CD cd)
    {   
        cd.setId(cds.size()+1); 
        cds.put(cd.getId(), cd);
        return cd;
    }

    public CD updateCD(CD cd)
    {   
        if(cd.getId()<=0)
        {
            return null;
        }
        cds.put(cd.getId(), cd);
        return cd;
    }

    public CD removeCD(long id)
    {
        return cds.remove(id);
    }

}

最佳答案

HTML 表单(除非您使用的是 AJAX)将以 application/x-www-form-urlencoded 数据类型发送数据。所以你需要修复你的资源方法来接受这种类型

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
public CD addCD(@FormParam("artist") String artist,
                @FormParam("title") String title,
                @FormParam("numberOfTracks") int numberOfTracks) {

}

您可能还想发送重定向以跟随 Post/Redirect/Get模式。

public Response addCD(...) {
    return Response.seeOther(...someUrl).build()
}

您可能还想考虑使用一些 AJAX 库来发出请求,而不是使用基本的 HTML 表单。这就是 REST API 的工作方式。

关于java - 带有 JAX-RX 的 REST API 从 jsp 页面中的表单发送和接收已解析的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42799721/

相关文章:

python - Django REST 仅列表(无详细信息)ViewSet

web-services - 如何在 Grails 中实现 REST Web 服务同时处理更多请求?

java - 如何使用 Dagger 2 将服务注入(inject) JavaFX Controller

java - Spring boot Rest controller - 将表单编码的主体转换为 POJO

json - jq 按日期过滤json

javascript - 在 JQuery 中迭代深层 JSON

java - 通过 HttpURLConnection 的 JSON POST 数据

java - 抽象类逻辑问题

java - 将 ArrayList 添加到嵌套在 Map 中的队列

javascript - 尝试访问 json 响应时出现“未定义”