安卓Java REST客户端API

29
我的服务器应用程序使用JAX-RS(Jersey实现)公开了一个RESTful Web服务。除了使用Apache HttpClient之外,调用此服务的最佳方法是什么?我想知道来自Jersey、Restlet、RESTeasy和其他框架的REST客户端API是否适用于Android。
谢谢, Theo

1
在Android上有一个RESTlet版本。 如果您的服务器代码到目前为止基于Jersey,那么将没有太多可重用的代码。 - b_erb
谷歌搜索似乎可以找到大量用于Android的REST客户端,以及编写自己的教程... - Martijn Verburg
4
谢谢您的留言,但是用谷歌搜索并不是我问题的答案。当然,我可以使用java.net.URL或Apache HttpClient来构建自己的解决方案,但我正在寻找最好(最方便)的方式。例如,在Android上,出于几个原因,我更喜欢使用Apache HttpClient而不是java.net.URL。如果您有一个JAX-RS Web服务,也许最好使用一个客户端,该客户端也具备JAX-RS感知功能,这样可以避免编写样板代码并提供更好的抽象化。 - Theo
你可能想要调查一下 https://github.com/square/retrofit。它仍然是一个快照版本,但看起来相当不错:https://github.com/square/retrofit/blob/master/samples/github-client/src/main/java/com/squareup/retrofit/sample/github/Client.java - Matthew
5个回答

9

Resteasy-mobile是一个完美的解决方案。

它基本上是全功能的resteasy(具有客户端框架),但使用Apache HTTP Client而不是HttpURLConnection(在Android上不存在)。

这里有更多关于使用的信息(http://docs.jboss.org/resteasy/docs/2.3.1.GA//userguide/html_single/index.html#RESTEasy_Client_Framework)

这里是maven的内容

    <dependency>
        <groupId>org.jboss.resteasy.mobile</groupId>
        <artifactId>resteasy-mobile</artifactId>
        <version>1.0.0</version>
    </dependency>

在 Android 端的示例代码如下:
    public class RestServices {
    static RegisterSVC registerSVC;
    static PushSVC pushSVC;
    static TrackerSVC trackerSVC;

    RestServices() {
        RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
    }

    public static RegisterSVC getRegisterSVC() {
        return ProxyFactory.create(RegisterSVC.class,"http://143.248.194.236:8080/notification");

    }

    public static PushSVC getPushSVC() {
        return ProxyFactory.create(PushSVC.class,"http://143.248.194.236:8080/notification");
    }

    public static TrackerSVC getTrackerSVC() {
        return ProxyFactory.create(TrackerSVC.class,"http://143.248.194.236:8080/notification");
    }
}

在Android和服务器端上,JAX-RS服务定义(PushSVC.java)

@Path("/mobile")
public interface PushSVC {
    /*
    Sample
    curl --data '{"collapseKey":"asdf","contentList":{"aaaa":"you","ssss":"you2"}}' -X POST -H 'Content-type:application/json' -v http://localhost:8080/notification/mobile/11111/send
     */
    @POST
    @Path("/{uuid}/send")
    @Consumes(MediaType.APPLICATION_JSON)
    String sendPush( MessageVO message, @PathParam("uuid") String uuid);

}

模型MessageVO定义

public class MessageVO {
    String collapseKey;
    HashMap<String, String> contentList;

    public MessageVO() {
    }

    public MessageVO(String collapseKey) {
        this.collapseKey = collapseKey;
        contentList = new HashMap<String, String>();
    }

    public void put(String key, String value)
    {
        this.contentList.put(key,value);
    }

    public String getCollapseKey() {
        return collapseKey;
    }

    public HashMap<String, String> getContentList() {
        return contentList;
    }
}

这是在Android上的方法调用

public class Broadcast extends AsyncTask<Context,Void,Void>
{

    @Override
    protected Void doInBackground(Context... contexts) {
        MessageVO message = new MessageVO("0");
        message.put("tickerText","Ticker ne` :D");
        message.put("contentTitle","Title ne` :D");
        message.put("contentText","Content ne` :D");
        RestServices.getPushSVC().sendPush(message,TrackInstallation.id(contexts[0]).toString());
        return null;
    }
}

这很简单,所有编写的代码都是可重用的,样板代码几乎不存在。

希望这能帮助大家。


3
HttpURLConnection自Android 1版本起就可用。在2.2版本以前,由于其实现存在缺陷,使用它被不推荐,但说它在Android上“不存在”是不正确的。 - aaronmarino
这绝对是Java REST后端的最佳解决方案。与RestEasy服务器端实现完美地配合使用。 - Rakesh Waghela

5
如果您想比处理URLConnection更加舒适一点,可以尝试使用Java的Resty。它简单、轻量级,但仍然相当新颖。 http://beders.github.com/Resty

3
我没能让它运行起来。它需要一些来自API 9(2.3)的类,所以这是一个不好的选择。 - u2ix
API 等级 9?你确定你评论的是正确的答案吗?让我知道我如何帮助。 - Jochen Bedersdorfer
Resty.java导入了java.net.CookieManager类,该类自Android Level 9(API Reference)以来已经存在于Android中。因此我无法加载该类。 - u2ix
1
啊,我明白了。对此很抱歉。由于支持Cookie,我无法做太多事情。感谢您的尝试,再次为造成的不便道歉。 - Jochen Bedersdorfer

3

2

0

对于最简单的情况,您可以使用java.net.URL及其openConnection()方法来发出请求。然后使用数据绑定库(XML使用JAXB,JSON使用Jackson)来处理响应(如果您POST xml或json,则可能还需要处理请求)。


1
谢谢您的回答。我正在寻找一种更高级别的抽象解决方案,例如RESTeasy客户端代理框架,可以重用现有的JAX-RS Java接口来创建客户端代理。但我不确定这些“JAX-RS感知”的客户端API是否也适用于Android。 - Theo
明白了,有时候这很好。然而,许多便利之处是因为数据绑定很容易。无论如何,我希望我能确定,但检查Jersey客户端可能是值得的。 - StaxMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接