Android和RESTful服务

时间:2011-05-23 20:31:52

标签: android rest post android-contentprovider

我正在尝试使用RESTful Web服务来实现应用程序。我研究了几个不同的例子,编写了一个很好的工作应用程序,可以成功地从REST服务中获取。但现在我需要一些方向。这是一些基本的背景(非常简化)......

  • 假设一个具有“GetReferrers”和“AddReferrer”方法的基本REST服务。
  • Activity,我致电managedQueryCursor为我的ContentProvider提供ListView
  • ContentProvider返回任何本地数据,并调用异步“GetReferrers”以获取最新的引荐服务器列表。
  • 我有一个自定义ResponseHandler来解析JSON并将其插入ContentProvider
  • 截至目前,我正在从服务器成功“获取”后删除本地ContentProvider中的所有记录,然后将新/更新列表插入数据库。

我有两个问题......

  1. 当我进行新的GET时,通常的做法是删除本地ContentProvider中的所有现有记录并插入新列表吗?或者对新的/更改/删除的记录进行检查以分别只添加/更改/删除会更好(尽管更耗时)吗?

  2. 我真的不知道在哪里开始从客户端进行“添加”以利用“AddReferrer”REST方法。我知道如何使用ContentProvider使用ContentValuesgetContentResolver().insert()本地添加新项目。但是,我会把代码放在哪里推送到服务器?或者更常见的做法是跳过添加到本地ContentProvider,将其推送到服务器,然后让GET将其拉回到本地ContentProvider

  3. 希望一切都有道理。我很欣赏你能给出的任何方向。如果有人知道这样一个好的双向例子,请分享。到目前为止,我发现的REST客户端操作的所有示例都只是从服务器“获取”而不是重新启动。

3 个答案:

答案 0 :(得分:2)

  1. 当我必须执行类似这样的操作后,我就可以实现像getReferrersSince(timestamp)这样的REST方法,它只给了我自上次同步以来的更改。但如果服务不在你的控制之下,我也建议第一个选择。检查每个条目的更改可能需要删除并重新插入所有条目,但更有可能是不一致。
    顺便说一下:Daniele Teti是对的。所以它实际上就像是 GET http://.../referrers?since=[timestamp]

  2. 只是为了确保:你看过Virgil Dobjanschi了吗?他建议首先在本地插入项目,并在额外的数据库列中将它们标记为“待定”(例如SYNC_STATUS)。然后有一个服务在后台通过REST上传所有待处理项目并将其标记为“已同步”。

答案 1 :(得分:0)

这只是我的意见,但对于问题#1,我建议只删除数据库中的当前记录,然后在成功的网络电话上重新插入它们。使用后面的建议,您必须创建一个函数来遍历数据库中的所有当前值,看看它们是否与新集合匹配(我假设您将使用某种主键来建立连接)然后更新/删除/向数据库添加值,这可能是对数据库的大量调用,除非您创建一些通用更新语句,其中您以字符串形式动态构建“SET / WHERE”子句,然后运行一次查询。

无论哪种方式,从效率的角度来看,在我看来,仅运行删除和插入查询与复杂匹配函数以及多个更新/添加/删除查询似乎是最好的方法。

对于问题#2,您必须在代码中构建XML,然后像这些示例一样发布:

Android Post Example

Another Example

或者,您可以通过URL字符串传递值,然后让服务器提取这些值。

例如:

http://www.example.com/MyWebService.asmx/AddReferrer?variable1=foo&variable2=bar&variable1=foo2&variable2=bar2

在该示例中,我假设服务器是.net服务器。在.net中,我基本上可以为variable1创建一个包含所有值的数组,然后循环遍历它们,并将它们作为服务器端添加到DB中。

[WebMethod]
public string AddReferrer(string[] variable1, string[] variable2)
{

希望这有帮助!

答案 2 :(得分:-1)

在方法名称中,你不应该有动词。在RESTful系统中,“动作”隐含了http请求动词。 AddReferrer应该被称为“referrers”,应该使用PUT http方法调用。请查看以下文章http://www.infoq.com/articles/rest-introduction