所以我对Restlet陌生。我正在创建一个可以与GAE服务器(使用objectify DB)进行通信的Android应用程序
我做了这个很好的教程来学习:
http://www.tutos-android.com/webservice-rest-android-appengine-restlet-objectify
它工作得很好,但是却很少。
两种方法之一:
public interface UserControllerInterface {
@Put
void create(User user);
@Get
Container getAllUsers();
}
对于我的应用程序来说,它更加复杂,因此我添加了更多方法:
public interface UserControllerInterface {
@Put
public void createUser(ObagooUser user);
@Put
public void createMessage(ObagooUser user, String message);
@Put
public void updateMessage(ObagooMessage message);
@Get
public List<ObagooUser> getAllUser();
@Get
public ObagooUser getUserById(String id);
@Get
public List<ObagooMessage> getAllMessage();
@Get
public List<ObagooMessage> getAllMessageFromSender(ObagooUser sender);
@Get
public ObagooMessage getFreeMessage(ObagooUser user);
}
这些方法都可以在服务器端工作(我在Junit上进行了测试)。
现在,我正在编码android部分,但遇到了问题。
当我对getAllMessage()进行简单调用时,出现错误:
java.lang.IllegalArgumentException: id cannot be zero
at com.google.appengine.api.datastore.KeyFactory.createKey(KeyFactory.java:44)
at com.googlecode.objectify.ObjectifyFactory.typedKeyToRawKey(ObjectifyFactory.java:269)
at com.googlecode.objectify.impl.ObjectifyImpl.find(ObjectifyImpl.java:159)
at com.googlecode.objectify.impl.ObjectifyImpl.find(ObjectifyImpl.java:183)
at com.obagoo.dao.ObagooUserDAO.getUserById(ObagooUserDAO.java:43)
at com.obagoo.controller.ObagooController.getUserById(ObagooController.java:47)
它使用错误的方法(getUserById)。
我在getAllMessage中设置了一个断点,它正在传入,但在其他方法中也是如此。
如果我多次测试,有时会调用createUser或其他随机方法。
看到我错了吗?
添加getAllMessage代码:
public List<ObagooMessage> getAllMessage() {
// logger.debug("Getting all Obagoo Messages");
List<ObagooMessage> msg = new ArrayList<ObagooMessage>();
Objectify ofy = ObjectifyService.begin();
Query<ObagooMessage> q = ofy.query(ObagooMessage.class);
for (ObagooMessage u : q) {
msg.add(u);
}
return msg;
}
最佳答案
在我看到的示例中,它总是表明您应该将处理列表资源的controller
/ resource
与单个项目(基于URI
/ id
的)资源分开。因此,您将获得以下内容:
router.attach("/users", UsersController.class);
router.attach("/users/{id}", UserController.class
router.attach("/messages", MessagesController.class);
请注意,第一类为
name
的复数命名,第二类为UsersController
的单数命名。第一类将处理没有提供id的情况,例如获取所有用户。另外,请注意在UserController
中提供ID时,可以将其自动映射到该类的ID字段中。因此URI
方法在方法调用上没有参数。至于处理子集,然后对于来自特定用户的消息,可以使用查询参数进行处理。例如,当通过带有
Get
的URI
进行调用时,/messages?sender=id
将在处理Get的方法中使用以下内容:Form queryParams = getRequest().getResourceRef().getQueryAsForm();
String id = queryParams.getFirstValue("sender");
希望能有所帮助。我不是专家,所以任何人都可以纠正我。