我有一个休息服务,它从数据库中检索数据并将其返回给客户端。我希望调用服务的客户端传递参数以在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);
我没有收到任何错误,但客户端类没有显示任何结果。任何人都可以帮助我吗?
答案 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使用引用,因此在循环外实例化它将导致列表中填充指向同一引用的对象,这将导致列表中的所有对象具有相同的值(循环的最后一个)。