gpt4 book ai didi

java - 传递查询参数rest客户端

转载 作者:行者123 更新时间:2023-11-30 07:19:40 26 4
gpt4 key购买 nike

我有一个休息服务,可以从数据库检索数据并将其返回给客户端。我希望调用服务的客户端传递参数,以便在 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);

我没有收到任何错误,但客户端类没有显示任何结果。谁能帮我吗?

最佳答案

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

第一:

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

但这只是为了向您表明您应该注意在查询中连接参数所带来的问题。

第二:您的代码很容易出现 SQLInjection正如@peeskillet 在评论中提到的。为了避免这种情况,您应该使用准备好的语句,如下所示:

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()) {
....

不要忘记关闭 tryfinnaly block 上的资源和连接

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

关于java - 传递查询参数rest客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37791601/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com