Dropwizard REST 问题

Dropwizard REST problems

我正在使用 dropwizard (jersey, jackson) 创建 REST API 并且偶然发现了一些我似乎无法找到答案的问题。 我想基于 json 文件构建 sql 查询。这将通过地图(标准、价值)来完成。我在意识到这一点时遇到了一些问题:

代码:

用户资源:

@POST
@Path("/list")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public List<User> getUser(@Auth UserToken token, JSONObject json) {
return userDAO.getUserByCriteria(json);
}

用户道:

List<User> getInvoiceByCriteria(@Bind("json") JSONObject json);

我想让它做这样的事情:

@SqlQuery("SELECT * FROM user WHERE crit1 = :crit1 AND crit2 = :crit2 LIMIT 10")
@RegisterRowMapper(UserMapper.class)
List<User> getUserByCriteria(@Bind("json") Map json){
//EXTRACT VALUES OF MAP HERE
//
};

我意识到这是一个非常模糊的问题。问题是我对这个 REST 东西是一个相当大的菜鸟,我遇到的问题并不常见(或者我正在寻找错误的东西)。 非常感谢任何help/insight!

关于 http/rest 的额外问题: 我觉得这应该是 GET 请求而不是 POST,但我的 Advanced Rest Client 不允许在 GET 请求中包含正文。我在网上发现通常不会这样做,但允许这样做。这里使用 POST 可以吗?

我将首先回答您的 Xtra 问题:

GET的objective是通过URI和URI中发送的params获取数据。 b/w 可以或应该有区别。这与使用 GET 的 Body 相同,您可以使用 GET 发送正文,但是您没有遵循 HTTP 指南,而且 GET 和 POST 的目的混合在一起。 <Refer Here> and <here>

现在进入你的问题。您正在

发送 JSONObject json
public List<User> getUser(@Auth UserToken token, JSONObject json) {
return userDAO.getUserByCriteria(json);
}

但是你正在匹配地图。 Map 基本上是娱乐 TypeErasure < 这意味着在编译代码时,您的集合的泛型将被 this 的绑定对象替换> 您可以在必要时插入类型转换以保持类型安全。你也可以使用这样的东西

List<User> getInvoiceByCriteria(@Bind("json") Map<K extends String , V extends MyObject> json);

这是一个使用 Mapper 的 DAO 接口的简单示例:

@RegisterMapper(EmployeeMapper.class)
public interface EmployeeDao {

@SqlQuery("select * from employee;")
public List<Employee> getEmployees();

@SqlQuery("select * from employee where id = :id")
public Employee getEmployee(@Bind("id") final int id);

@SqlUpdate("insert into employee(name, department, salary) values(:name, :department, :salary)")
void createEmployee(@BindBean final Employee employee);

@SqlUpdate("update employee set name = coalesce(:name, name), " +
        " department = coalesce(:department, department), salary = coalesce(:salary, salary)" +
        " where id = :id")
void editEmployee(@BindBean final Employee employee);

@SqlUpdate("delete from employee where id = :id")
int deleteEmployee(@Bind("id") final int id);

@SqlQuery("select last_insert_id();")
public int lastInsertId();
}

这是上面使用的 Employee Mapper Class:

public class EmployeeMapper implements ResultSetMapper<Employee> {
private static final String ID = "id";
private static final String NAME = "name";
private static final String DEPARTMENT = "department";
private static final String SALARY = "salary";

public Employee map(int i, ResultSet resultSet, StatementContext statementContext)
        throws SQLException {
    Employee employee = new Employee(resultSet.getString(NAME), resultSet.getString(DEPARTMENT),resultSet.getInt(SALARY));
    employee.setId(resultSet.getInt(ID));
    return employee;
}
}

我已经在博客 post 上解释了如何使用 JDBI,通过简单的步骤在 Dropwizard 中创建 REST API,还有一个我在 GitHub 上创建的示例工作应用程序。请检查:http://softwaredevelopercentral.blogspot.com/2017/08/dropwizard-mysql-integration-tutorial.html