49 votes

comment appeler le service Web RESTful depuis Android?

J'ai écrit un service web REST dans netbean IDE à l'aide de jersey cadre et java. Pour chaque demande, l'utilisateur doit définir un nom d'utilisateur et le mot de passe, je sais que cette authentification n'est pas bon (à l'aide d'une boucle de commande comme: curl-u nom d'utilisateur:mot de passe -X METTRE http://localhsot:8080/user).

Maintenant, je veux appeler un service web REST à partir d'un android de classe. Que dois-je écrire? Je suis nouveau sur android. J'ai un android classe qui utilise DefaultHttpClient et CredentialUsernameAndPassword. Mais quand je le lance dans eclipse, j'ai parfois l'exception d'exécution ou sdk exception.

N'importe qui de me donner un exemple de code et de la suggestion?

19voto

Ryan Olds Points 3022

Voici un très bon article sur l'utilisation de DefaultHttpClient:

Faire une requête HTTP avec Android

19voto

Varghese John Points 93

Ceci est un exemple de classe restclient

 public class RestClient
{
public enum RequestMethod
{
    GET,
    POST
}
public int responseCode=0;
public String message;
public String response;
public void Execute(RequestMethod method,String url,ArrayList<NameValuePair> headers,ArrayList<NameValuePair> params) throws Exception
{
    switch (method)
    {
        case GET:
        {
            // add parameters
            String combinedParams = "";
            if (params!=null)
            {
                combinedParams += "?";
                for (NameValuePair p : params)
                {
                    String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue(),"UTF-8");
                    if (combinedParams.length() > 1)
                        combinedParams += "&" + paramString;
                    else
                        combinedParams += paramString;
                }
            }
            HttpGet request = new HttpGet(url + combinedParams);
            // add headers
            if (headers!=null)
            {
                headers=addCommonHeaderField(headers);
                for (NameValuePair h : headers)
                    request.addHeader(h.getName(), h.getValue());
            }
            executeRequest(request, url);
            break;
        }
        case POST:
        {
            HttpPost request = new HttpPost(url);
            // add headers
            if (headers!=null)
            {
                headers=addCommonHeaderField(headers);
                for (NameValuePair h : headers)
                    request.addHeader(h.getName(), h.getValue());
            }
            if (params!=null)
                request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            executeRequest(request, url);
            break;
        }
    }
}
private ArrayList<NameValuePair> addCommonHeaderField(ArrayList<NameValuePair> _header)
{
    _header.add(new BasicNameValuePair("Content-Type","application/x-www-form-urlencoded"));
    return _header;
}
private void executeRequest(HttpUriRequest request, String url)
{
    HttpClient client = new DefaultHttpClient();
    HttpResponse httpResponse;
    try
    {
        httpResponse = client.execute(request);
        responseCode = httpResponse.getStatusLine().getStatusCode();
        message = httpResponse.getStatusLine().getReasonPhrase();
        HttpEntity entity = httpResponse.getEntity();

        if (entity != null)
        {
            InputStream instream = entity.getContent();
            response = convertStreamToString(instream);
            instream.close();
        }
    }
    catch (Exception e)
    { }
}

private static String convertStreamToString(InputStream is)
{
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line = null;
    try
    {
        while ((line = reader.readLine()) != null)
        {
            sb.append(line + "\n");
        }
        is.close();
    }
    catch (IOException e)
    { }
    return sb.toString();
}
 

}

14voto

Tianhai Points 345

Récemment découvert qu'un tiers de la bibliothèque - Place de Rénovation peuvent faire le travail très bien.


La définition du point de terminaison REST

public interface GitHubService {
   @GET("/users/{user}/repos")
   List<Repo> listRepos(@Path("user") String user,Callback<List<User>> cb);
}

Obtenir le service concret

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.github.com")
    .build();
GitHubService service = restAdapter.create(GitHubService.class);

Appeler le point de terminaison REST

List<Repo> repos = service.listRepos("octocat",new Callback<List<User>>() { 
    @Override
    public void failure(final RetrofitError error) {
        android.util.Log.i("example", "Error, body: " + error.getBody().toString());
    }
    @Override
    public void success(List<User> users, Response response) {
        // Do something with the List of Users object returned
        // you may populate your adapter here
    }
});

La bibliothèque gère la sérialisation json et deserailization pour vous. Vous pouvez personnaliser la sérialisation et la désérialisation trop.

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .registerTypeAdapter(Date.class, new DateTypeAdapter())
    .create();

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.github.com")
    .setConverter(new GsonConverter(gson))
    .build();

6voto

Naveen Points 2480

J'utilise ce client REST pour mon Android. Cela a l'air vraiment cool. Beau travail de Luke.

http://lukencode.com/2010/04/27/calling-web-services-in-android-using-httpclient/

6voto

luigi7up Points 973

Arrêtez avec ce que vous faisiez! :)

Implémentez le client RESTful en tant que SERVICE et déléguez le processus réseau intensif à un composant indépendant de l'activité: un SERVICE.

Regardez cette vidéo perspicace http://www.youtube.com/watch?v=xHXn3Kg2IQE où Virgil Dobjanschi explique sa démarche face à ce défi ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X