【问题标题】:Java REST client API for Android [closed]适用于 Android 的 Java REST 客户端 API [关闭]
【发布时间】:2010-12-06 15:40:05
【问题描述】:

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

谢谢, 西奥

【问题讨论】:

  • 有一个适用于 Android 的 RESTlet 版本。如果你的服务器代码到目前为止是基于 Jersey 的,那么可重用的代码就不多。
  • 谷歌搜索似乎会抛出大量适用于 android 的 REST 客户端以及编写自己的教程......
  • @Martijn Verburg 感谢您的评论,但谷歌搜索不是我问题的答案。当然,我可以使用 java.net.URL 或 Apache HttpClient 构建自己的,但我一直在寻找最好(最方便)的方法。例如。在 Android 上,出于几个原因,我更喜欢 Apache HttpClient 而不是 java.net.URL。当您拥有 JAX-RS Web 服务时,最好使用同样支持 JAX-RS 的客户端,从而避免编写样板代码并提供更好的抽象。
  • 您可能想调查github.com/square/retrofit。它仍然是一个快照版本,但看起来很漂亮:github.com/square/retrofit/blob/master/samples/github-client/…

标签: java android web-services rest


【解决方案1】:

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

它基本上是成熟的 resteasy(有客户端框架),但使用 Apache HTTP 客户端而不是 HttpURLConnection(在 android 上不存在)

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

这是给专家的

    <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;
    }
}

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

希望对大家有所帮助。

【讨论】:

  • HttpURLConnection 从版本 1 开始在 Android 上可用。在 2.2 之前,由于实现存在错误,不鼓励使用它,但说它在 Android 上“不存在”是不正确的。跨度>
  • 这是迄今为止最好的 java rest 后端解决方案。很好地与 rest easy 服务器端实现配合使用。
【解决方案2】:

如果您想要比处理 URLConnection 更舒适一些,请查看 Resty for Java。 简单、轻巧,但仍然很新。

http://beders.github.com/Resty

【讨论】:

  • 我没有运行这个。它需要一些来自 api 级别 9 (2.3) 的类,所以这是一个糟糕的选择。
  • API 级别 9?您确定您评论了正确的答案吗?让我知道如何提供帮助
  • Resty.java 导入了 java.net.CookieManager,它在 Android 9 级以后就存在了。API Reference。所以我无法加载课程。
  • 啊,知道了。对于那个很抱歉。我对此无能为力,因为支持 cookie。感谢您的尝试,再次对由此造成的不便深表歉意
【解决方案3】:

前几天遇到了这个,还没有尝试过,但似乎可以在android上运行: http://crest.codegist.org

【讨论】:

    【解决方案4】:

    这是一个很好的例子,它包含所有东西的源代码,包括 EJB、RestEasy 和 Android:

    http://code.google.com/p/android-jbridge/

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 感谢您的回答。我正在寻找一种提供更高抽象级别的解决方案,例如就像 RESTeasy 客户端代理框架一样,您可以在其中重用现有的 JAX-RS Java 接口来创建客户端代理。但我不确定这些“JAX-RS 感知”客户端 API 是否也适用于 Android。
      • 明白,有时这很好。然而,很多便利是由于数据绑定很容易。无论如何,我希望我能确定,但​​也许值得去看看 Jersey 客户。
      猜你喜欢
      • 1970-01-01
      • 2011-06-25
      • 2017-06-25
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      相关资源
      最近更新 更多