REST API : 使用@QueryParam 从 MongoDB 加载数据
REST API : Using @QueryParam to load data from MongoDB
对于 Jersey 的 restful 服务,我没有找到如何使用 @QueryParam 从 MongoDB 加载数据,否则我希望能够通过传递用户 ID 来搜索用户在 url 中:
localhost:9999/home/users/user?id=547ec 这应该为 id=547ec 的用户加载特定数据。
这是我的代码,它 returns 一个空白页:
@Path("/user")
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getUserByID(@QueryParam("_id") String id) {
String returnString = "";
BasicDBObject query = new BasicDBObject("_id",id);
DB db = null;
try{
MongoClient mongo = new MongoClient("localhost", 27017);
db = mongo.getDB("mfj");
DBCollection dbc = db.getCollection("user");
DBCursor cursorByID = dbc.find(query);
JSON json =new JSON();
returnString =json.serialize(cursorByID);
}catch (Exception ex){
ex.printStackTrace();
}
return returnString;
}
_id != id
。在 URL 中,您使用的是 id
,但 @QueryParam
需要 id
。
new BasicDBObject("_id",id);
是个问题。当你用id查询时,你应该用ObjectId
查询。所以
`new BasicDBObject("_id", new ObjectId(id));
您刚刚从 DBCursor
中获得第一个 DBObject
。您只需调用它的 toString()
即可获得 JSON。所以
DBCursor cursor = collection.find(query);
DBObject object = cursor.next();
returnString = object.toString();
这不是问题,只是设计偏好的问题,但我会改用 @PathParam
并将 id 放在路径中而不是查询参数中。所以
@Path("/{id}")
public Sting yourMethod(@PathParam("id") String id)
// then use .../hello/users/3298ru2390r8
放在一起可能看起来像
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.bson.types.ObjectId;
@Path("/users")
public class MongoResource {
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response getMongoObject(@PathParam("id") String id) throws Exception {
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
DB db = mongoClient.getDB("mfj");
DBCollection collection = db.getCollection("user");
BasicDBObject query = new BasicDBObject("_id", new ObjectId(id));
DBCursor cursor = collection.find(query);
DBObject object = cursor.next();
if (object == null) {
throw new WebApplicationException(Response.Status.NOT_FOUND);
}
return Response.ok(object.toString()).build();
}
}
以下应该有效(我自己测试过),因为 547ec
是实际的 id
localhost:9999/home/users/547ec
顺便说一句,MongoClient
是线程安全的,因此建议只创建一个实例,而不是像您目前正在为每个请求创建一个实例。
对于 Jersey 的 restful 服务,我没有找到如何使用 @QueryParam 从 MongoDB 加载数据,否则我希望能够通过传递用户 ID 来搜索用户在 url 中: localhost:9999/home/users/user?id=547ec 这应该为 id=547ec 的用户加载特定数据。
这是我的代码,它 returns 一个空白页:
@Path("/user")
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getUserByID(@QueryParam("_id") String id) {
String returnString = "";
BasicDBObject query = new BasicDBObject("_id",id);
DB db = null;
try{
MongoClient mongo = new MongoClient("localhost", 27017);
db = mongo.getDB("mfj");
DBCollection dbc = db.getCollection("user");
DBCursor cursorByID = dbc.find(query);
JSON json =new JSON();
returnString =json.serialize(cursorByID);
}catch (Exception ex){
ex.printStackTrace();
}
return returnString;
}
_id != id
。在 URL 中,您使用的是id
,但@QueryParam
需要id
。new BasicDBObject("_id",id);
是个问题。当你用id查询时,你应该用ObjectId
查询。所以`new BasicDBObject("_id", new ObjectId(id));
您刚刚从
DBCursor
中获得第一个DBObject
。您只需调用它的toString()
即可获得 JSON。所以DBCursor cursor = collection.find(query); DBObject object = cursor.next(); returnString = object.toString();
这不是问题,只是设计偏好的问题,但我会改用
@PathParam
并将 id 放在路径中而不是查询参数中。所以@Path("/{id}") public Sting yourMethod(@PathParam("id") String id) // then use .../hello/users/3298ru2390r8
放在一起可能看起来像
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.bson.types.ObjectId;
@Path("/users")
public class MongoResource {
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response getMongoObject(@PathParam("id") String id) throws Exception {
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
DB db = mongoClient.getDB("mfj");
DBCollection collection = db.getCollection("user");
BasicDBObject query = new BasicDBObject("_id", new ObjectId(id));
DBCursor cursor = collection.find(query);
DBObject object = cursor.next();
if (object == null) {
throw new WebApplicationException(Response.Status.NOT_FOUND);
}
return Response.ok(object.toString()).build();
}
}
以下应该有效(我自己测试过),因为 547ec
是实际的 id
localhost:9999/home/users/547ec
顺便说一句,MongoClient
是线程安全的,因此建议只创建一个实例,而不是像您目前正在为每个请求创建一个实例。