Как вызвать RESTful веб-сервис с Android? - PullRequest
48 голосов
/ 18 мая 2011

Я написал веб-сервис REST в среде IDE Netbean, используя Jersey Framework и Java.

Для каждого запроса пользователю необходимо указать имя пользователя и пароль. Я знаю, что эта аутентификация не является оптимальной практикой (используется команда curl, например: curl -u username:password -X PUT http://localhsot:8080/user).

Теперь яхотите вызвать веб-сервис REST из класса Android.

Как мне это сделать?

У меня есть класс Android, который использует DefaultHttpClient и CredentialUsernameAndPassword, но когда я запускаю его в Eclipse, иногда я получаю исключение времени выполнения или SDK.

Ответы [ 11 ]

19 голосов
/ 08 августа 2011

Это пример класса 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();
    }
}
14 голосов
/ 09 мая 2014

Недавно обнаружил, что сторонняя библиотека - Square Retrofit может выполнять эту работу очень хорошо.


Определение конечной точки REST

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

Получение конкретной услуги

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

Вызов конечной точки 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
    }
});

Библиотека обрабатывает сериализацию и десериализацию json для вас.Вы также можете настроить сериализацию и десериализацию.

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();
6 голосов
/ 31 мая 2013

Остановись, чем бы ты ни занимался!:)

Внедрите клиент RESTful как СЕРВИС и делегируйте интенсивный сетевой ресурс независимому компоненту активности: СЕРВИС.

Посмотрите это проницательное видео http://www.youtube.com/watch?v=xHXn3Kg2IQE, где Вирджил Добжански объясняет свой подход (ы) к этому вызову ...

6 голосов
/ 18 мая 2011

Я использую этот REST Client для моего андроида. Это выглядит действительно круто. Хорошая работа Люка.

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

1 голос
/ 22 августа 2016

Использование Spring для Android с RestTemplate https://spring.io/guides/gs/consuming-rest-android/

// The connection URL 
String url = "https://ajax.googleapis.com/ajax/" + 
    "services/search/web?v=1.0&q={query}";

// Create a new RestTemplate instance
RestTemplate restTemplate = new RestTemplate();

// Add the String message converter
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());

// Make the HTTP GET request, marshaling the response to a String
String result = restTemplate.getForObject(url, String.class, "Android");
1 голос
/ 10 июня 2016

Я использовал OkHttpClient для вызова успокоительного веб-сервиса. Это очень просто.

OkHttpClient httpClient = new OkHttpClient();
Request request = new Request.Builder()
                .url(url)
                .build();

Response response = httpClient.newCall(request).execute();
String body = response.body().string()
0 голосов
/ 15 сентября 2018

Для этого существует множество библиотек

Модернизация заменяет традиционную AsyncTask и имеет собственную фоновую задачу, так что вам не нужно об этом беспокоиться.Производительность также очень хорошая по сравнению с AsyncTask.

Проверьте здесь,

http://square.github.io/retrofit/

Полный пример модернизации можно найти здесь,

https://futurestud.io/blog/retrofit-getting-started-and-android-client/

Залп также эффективен и прост в использовании.Вы можете посмотреть здесь:

https://github.com/mcxiaoke/android-volley

В сети есть куча ресурсов о том, как его использовать:

http://www.androidhive.info/2014/05/android-working-with-volley-library-1

AsyncTask

ИЛИ Вы должны использовать AsyncTask и затем переопределить метод doInTheBackground() - где вы можете реализовать вызов REST.

Затем вы можете использоватьonPostExecute(), чтобы позволить потоку пользовательского интерфейса обрабатывать результаты, которые были возвращены на предыдущем шаге.

Этот ответ является хорошим примером того, как реализовать AsyncTask.см. пример AsyncTask для Android

В приведенном ниже комментарии Ruffles приведен более актуальный пример вызова REST с использованием AsyncTask: http://alvinalexander.com/android/android-asynctask-http-client-rest-example-tutorial

0 голосов
/ 22 февраля 2017

Вот моя библиотека, которую я создал для простого вызова Webservice,

Вы можете использовать это, добавив однострочную зависимость gradle -

compile 'com.scantity.ScHttpLibrary:ScHttpLibrary:1.0.0'

Вот демонстрация использования.

https://github.com/vishalchhodwani1992/httpLibrary

0 голосов
/ 12 апреля 2016

Выполните следующие шаги, чтобы потреблять RestFul в Android.

Step1

Создание пустого проекта Android.

Step2

Требуется разрешение на доступ в интернет. напишите приведенный ниже код в файле AndroidManifest.xml.

 <uses-permission android:name="android.permission.INTERNET">
</uses-permission>

Step3

Требуется URL-адрес RestFul, запущенный на другом сервере или на том же компьютере.

Step4

Создайте клиент RestFul, который расширит AsyncTask. См. RestFulPost.java.

Step5

Создание класса DTO для запросов и ответов RestFull.

RestFulPost.java

package javaant.com.consuming_restful.restclient;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import com.google.gson.Gson;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import java.util.Map;
import javaant.com.consuming_restful.util.Util;
/**
 * Created by Nirmal Dhara on 29-10-2015.
 */
public class RestFulPost extends AsyncTask<map, void,="" string=""> {
    RestFulResult restFulResult = null;
    ProgressDialog Asycdialog;
    String msg;
    String task;
    public RestFulPost(RestFulResult restFulResult, Context context, String msg,String task) {
        this.restFulResult = restFulResult;
        this.task=task;
        this.msg = msg;
        Asycdialog = new ProgressDialog(context);
    }
    @Override
    protected String doInBackground(Map... params) {
        String responseStr = null;
        Object dataMap = null;
        HttpPost httpost = new HttpPost(params[0].get("url").toString());

        try {
            dataMap = (Object) params[0].get("data");
            Gson gson = new Gson();
            Log.d("data  map", "data map------" + gson.toJson(dataMap));
            httpost.setEntity(new StringEntity(gson.toJson(dataMap)));
            httpost.setHeader("Accept", "application/json");
            httpost.setHeader("Content-type", "application/json");
            DefaultHttpClient httpclient= Util.getClient();
            HttpResponse response = httpclient.execute(httpost);
            int statusCode = response.getStatusLine().getStatusCode();
            Log.d("resonse code", "----------------" + statusCode);

            if (statusCode == 200)
                responseStr = EntityUtils.toString(response.getEntity());
            if (statusCode == 404) {
                responseStr = "{\n" +
                        "\"status\":\"fail\",\n" +
                        " \"data\":{\n" +
                        "\"ValidUser\":\"Service not available\",\n" +
                        "\"code\":\"404\"\n" +
                        "}\n" +
                        "}";
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return responseStr;
    }
    @Override
    protected void onPreExecute() {
        Asycdialog.setMessage(msg);
        //show dialog
        Asycdialog.show();
        super.onPreExecute();
    }
    @Override
    protected void onPostExecute(String s) {
        Asycdialog.dismiss();
        restFulResult.onResfulResponse(s,task);
    }
}

Для получения более подробной информации и полного кода, пожалуйста, посетите http://javaant.com/consume-a-restful-webservice-in-android/#.VwzbipN96Hs

0 голосов
/ 25 июня 2015

Возможно, я опоздал или, может быть, вы уже использовали его раньше, но есть еще один, который называется ksoap , и он довольно удивителен. Он также включает тайм-ауты и может эффективно анализировать любой веб-сервис на основе SOAP. Я также внес несколько изменений в соответствии с моим синтаксическим анализом .. Поиск

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...