传递查询参数休息客户端

时间:2016-06-13 13:54:50

标签: java rest jersey

我有一个休息服务,它从数据库中检索数据并将其返回给客户端。我希望调用服务的客户端传递参数以在sql查询select中使用它们并在控制台中显示服务器输出。这就是我设法做到的:

@GET
    @Path("Result")
    @Produces("application/json")
    public String getPerson(@QueryParam("nom") String nom, @QueryParam("prenom") String prenom) {
        ArrayList <Persons> persons= new ArrayList<Persons>();
        Persons person = new Persons();

        String query = "Select * from persons where nom=' " + nom + "' and prenom ='" + prenom + "'";
        System.out.println(query);
        bdcon = new BDConnexion();
        try {
            conn = BDConnexion.ConnecterBD();
            res = bdcon.getResultSet(query, conn);
            while (res.next()) {
                person.setNom(res.getString(1));
                person.setPrenom(res.getString(2));
                persons.add(person);
            }
        } catch (SQLException ex) {
            Logger.getLogger(PersonService.class.getName()).log(Level.SEVERE, null, ex);
        }
        String json = new Gson().toJson(persons);
        return json;
    }

休息客户:

Client client = Client.create();
WebResource webresource = client.resource("http://localhost:8080/PersonServ/rest/Persons/Result")
.queryParam("nom", nom)
.queryParam("prenom",prenom);
ClientResponse response = webresource.accept("application/json").get(ClientResponse.class);
 if (response.getStatus() != 200) {
               throw new RuntimeException("Failed : HTTP error code : "
                + response.getStatus());
            }
            String output = response.getEntity(String.class);

            System.out.println("Output from Server .... \n");
            System.out.println(output);

我没有收到任何错误,但客户端类没有显示任何结果。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

正如评论中所讨论的,实际问题出在查询中。还有一些事情应该修复。

<强>首先

String query = "Select * from persons where nom=' " + nom + "' and prenom ='" + prenom + "'";
                                                 ^
                                                 |_ There is an extra space here. Take it out

但这只是为了向您展示您应该了解查询中连接参数所带来的问题。

第二: @peeskillet在评论中提及您的代码SQLInjection。为了避免这种情况,你应该使用预备语句,如下所示:

conn = BDConnexion.ConnecterBD();
String selectSQL = "select * from persons where nom=? and prenom=?";
PreparedStatement preparedStatement = conn.prepareStatement(selectSQL);
preparedStatement.setString(1, nom);
preparedStatement.setString(2, prenom);
ResultSet rs = preparedStatement.executeQuery(selectSQL);
while (rs.next()) {
   ....

请勿忘记关闭finnaly

try区块上的资源和连接

第三:在while循环中初始化Persons person = new Persons();。 Java使用引用,因此在循环外实例化它将导致列表中填充指向同一引用的对象,这将导致列表中的所有对象具有相同的值(循环的最后一个)。