2010-12-06 3 views
29

Мое серверное приложение предоставляет веб-службу RESTful с использованием JAX-RS (исполнение Джерси). Каков наилучший способ вызвать эту службу (кроме использования Apache HttpClient)? Мне было интересно, работают ли на Android Android REST Client API от Jersey, Restlet, RESTeasy и других фреймворков.API-интерфейс API Java REST для Android

Спасибо, Тео

+1

Существует версия RESTlet для Android. Если ваш серверный код основан на Джерси до сих пор, не будет много многоразового кода. – 2010-12-06 15:42:35

+0

Googling, похоже, выбрасывает множество клиентов REST для Android, а также учебные пособия по написанию собственных ... – 2010-12-06 15:56:49

+4

@Martijn Verburg Спасибо за ваш комментарий, но Googling не является ответом на мой вопрос. Конечно, я мог бы создать свой собственный, используя java.net.URL или Apache HttpClient, но я искал лучший (самый удобный) способ. Например.на Android, я бы предпочел Apache HttpClient через java.net.URL по нескольким причинам. И когда у вас есть веб-сервис JAX-RS, может быть, лучше, если вы используете клиента, который также JAX-RS знает, что вы можете писать код шаблона и улучшать абстракции. – Theo 2010-12-07 07:27:37

ответ

0

Для простейших случаев вы можете просто использовать java.net.URL и его метод OpenConnection(), чтобы сделать запрос. И тогда библиотеки привязки данных (JAXB для XML, Jackson для JSON) обрабатывают ответ (и, возможно, запрашивают POST xml или json).

5

Если вы хотите немного больше комфорта, чем иметь дело с URLConnection, ознакомьтесь с Resty for Java. Простой, легкий, но все еще довольно новый.

http://beders.github.com/Resty

3

Столкнулся этот другой день, не пробовал еще подумал, но, кажется, работает на Android: http://crest.codegist.org

9

Resteasy-mobile является идеальным решением.

Это в основном полномасштабная Resteasy (который имеет структуру клиента), но использует клиент Apache HTTP, а не HttpURLConnection (который не существует на андроид)

Вот больше информации об использовании (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> 

небольшой пример кода на андроид стороне

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

определение сервиса 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; 
    } 
} 

Это вызов метода на андроид

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

Это довольно просто, и все написанные коды многоразового использования, boi lerplate code находится рядом с небытием

Надеюсь, это поможет всем.