Использование Retrofit в Android

У меня есть приложение для Android, которое имеет 3 действия:

  1. Активность входа в систему
  2. Выполнение задач, в которых отображаются все задачи, относящиеся к пользователю (заполняется с использованием адаптера массива)
  3. Функция task_details, которая возникает при нажатии задачи в списке

Я должен использовать REST Apis. Исследование, которое я сделал до сих пор, направляет меня на использование Retrofit. Я проверил, как его использовать, и выяснил, что:

  1. Задайте базовый URL-адрес в главной операции (Mine – это активность входа)
  2. Мне нужно создать класс API и определить мои функции с помощью аннотаций.
  3. Используйте Адаптер отдыха класса в Управлении и определите Обратные вызовы.

Если бы мое приложение было одним активным приложением, я бы весь хрустнул в моем MainActivity.java, но я не знаю, как и где поставить весь код из шагов 1,2,3 для использования в моих 3 действиях. Не могли бы вы Помогите, рассказав, как использовать Retrofit в моем приложении. Большое спасибо.

В частности, мне нужны сетевые вызовы: 1. Вход в систему пользователя 2. Получите все задачи пользователя. И для обоих я буду использовать данный REST api.

Использование Retrofit довольно просто и просто.

Прежде всего, вам нужно добавить модификацию в свой проект, например, с помощью системы Gradle build.

compile 'com.squareup.retrofit:retrofit:1.7.1' | 

Другим способом вы можете скачать .jar и поместить его в свою папку libs.

Затем вам нужно определить интерфейсы, которые будут использоваться Retrofit для вызова API для ваших конечных точек REST. Например, для пользователей:

 public interface YourUsersApi { //You can use rx.java for sophisticated composition of requests @GET("/users/{user}") public Observable<SomeUserModel> fetchUser(@Path("user") String user); //or you can just get your model if you use json api @GET("/users/{user}") public SomeUserModel fetchUser(@Path("user") String user); //or if there are some special cases you can process your response manually @GET("/users/{user}") public Response fetchUser(@Path("user") String user); } 

ОК. Теперь вы определили свой интерфейс API, и можете попробовать его использовать.

Для начала вам нужно создать экземпляр RestAdapter и установить базовый URL-адрес вашего API-интерфейса. Это также довольно просто:

 RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://yourserveraddress.com") .build(); YourUsersApi yourUsersApi = restAdapter.create(YourUsersApi.class); 

Здесь Retrofit будет считывать вашу информацию с интерфейса, а под капотом он создаст RestHandler в соответствии с предоставленной вами метаинфорой, которая фактически будет выполнять HTTP-запросы.

Затем под капотом, после получения ответа, в случае json api ваши данные будут преобразованы в вашу модель с использованием библиотеки Gson, поэтому вы должны знать об этом факте, что ограничения, которые присутствуют в Gson, на самом деле присутствуют в Retrofit.

Чтобы продлить / переопределить процесс сериализаторов / десериализацию ваших данных ответа на ваши модели, вы можете захотеть предоставить свои пользовательские сериализаторы / десеризаторы для модернизации.

Здесь вам нужно реализовать интерфейс конвертера и реализовать 2 метода из Body () и toBody () .

Вот пример:

 public class SomeCustomRetrofitConverter implements Converter { private GsonBuilder gb; public SomeCustomRetrofitConverter() { gb = new GsonBuilder(); //register your cursom custom type serialisers/deserialisers if needed gb.registerTypeAdapter(SomeCutsomType.class, new SomeCutsomTypeDeserializer()); } public static final String ENCODING = "UTF-8"; @Override public Object fromBody(TypedInput body, Type type) throws ConversionException { String charset = "UTF-8"; if (body.mimeType() != null) { charset = MimeUtil.parseCharset(body.mimeType()); } InputStreamReader isr = null; try { isr = new InputStreamReader(body.in(), charset); Gson gson = gb.create(); return gson.fromJson(isr, type); } catch (IOException e) { throw new ConversionException(e); } catch (JsonParseException e) { throw new ConversionException(e); } finally { if (isr != null) { try { isr.close(); } catch (IOException ignored) { } } } } @Override public TypedOutput toBody(Object object) { try { Gson gson = gb.create(); return new JsonTypedOutput(gson.toJson(object).getBytes(ENCODING), ENCODING); } catch (UnsupportedEncodingException e) { throw new AssertionError(e); } } private static class JsonTypedOutput implements TypedOutput { private final byte[] jsonBytes; private final String mimeType; JsonTypedOutput(byte[] jsonBytes, String encode) { this.jsonBytes = jsonBytes; this.mimeType = "application/json; charset=" + encode; } @Override public String fileName() { return null; } @Override public String mimeType() { return mimeType; } @Override public long length() { return jsonBytes.length; } @Override public void writeTo(OutputStream out) throws IOException { out.write(jsonBytes); } } } 

И теперь вам нужно включить свои пользовательские адаптеры, если это необходимо, используя setConverter () для сборки RestAdapter

ОК. Теперь вы знаете, как вы можете получать свои данные с сервера на свое приложение для Android. Но вам нужно как-то сжать ваши данные и вызвать звонок REST в нужном месте. Там я бы предложил использовать службу android Service или AsyncTask или загрузчик или rx.java, которые будут запрашивать ваши данные в фоновом потоке, чтобы не блокировать ваш пользовательский интерфейс.

Итак, теперь вы можете найти наиболее подходящее место для звонка

 SomeUserModel yourUser = yourUsersApi.fetchUser("someUsers") 

Для получения удаленных данных.

Я только что переоборудовал пару недель, и сначала мне было трудно использовать его в своем приложении. Я хотел бы поделиться с вами самым простым способом использования модификации в вашем приложении. И затем, если вы уже хорошо разбираетесь в модернизации, вы можете улучшить свои коды (отделяя ui от api и использовать обратные вызовы) и, возможно, получить некоторые методы из поста выше.

В вашем приложении у вас есть Login, Activity для списка задач и активности для просмотра подробной задачи.

Во-первых, вам нужно добавить модификацию в приложение и сделать 2 пути, следуйте за сообщением @artemis выше.

Retrofit использует интерфейс как ваш API. Итак, создайте класс интерфейса.

 public interface MyApi{ /*LOGIN*/ @GET("/api_reciever/login") //your login function in your api public void login(@Query("username") String username,@Query("password") String password,Callback<String> calback); //this is for your login, and you can used String as response or you can use a POJO, retrofit is very rubust to convert JSON to POJO /*GET LIST*/ @GET("/api_reciever/getlist") //a function in your api to get all the list public void getTaskList(@Query("user_uuid") String user_uuid,Callback<ArrayList<Task>> callback); //this is an example of response POJO - make sure your variable name is the same with your json tagging /*GET LIST*/ @GET("/api_reciever/getlistdetails") //a function in your api to get all the list public void getTaskDetail(@Query("task_uuid") String task_uuid,Callback<Task> callback); //this is an example of response POJO - make sure your variable name is the same with your json tagging } 

Создайте еще один класс интерфейса, чтобы удержать все ваши BASE ADDRESS вашего api

 public interface Constants{ public String URL = "www.yoururl.com" } 

В вашей активности входа создайте метод обработки модифицированного

 private void myLogin(String username,String password){ RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(Constants.URL) //call your base url .build(); MyApi mylogin = restAdapter.create(MyApi.class); //this is how retrofit create your api mylogin.login(username,password,new Callback<String>() { @Override public void success(String s, Response response) { //process your response if login successfull you can call Intent and launch your main activity } @Override public void failure(RetrofitError retrofitError) { retrofitError.printStackTrace(); //to see if you have errors } }); } 

В своем MainActivityList

 private void myList(String user_uuid){ RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(Constants.URL) //call your base url .build(); MyApi mytask = restAdapter.create(MyApi.class); //this is how retrofit create your api mytask.getTaskDetail(user_uuid,new Callback<Task>>() { @Override public void success(ArrayList<Task> list, Response response) { //process your response if successful load the list in your listview adapter } @Override public void failure(RetrofitError retrofitError) { retrofitError.printStackTrace(); //to see if you have errors } }); } 

В вашем подробном списке

 private void myDetailed(String task_uuid){ RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(Constants.URL) //call your base url .build(); MyApi mytask = restAdapter.create(MyApi.class); //this is how retrofit create your api mytask.getTaskList(task_uuid,new Callback<Task>() { @Override public void success(Task task, Response response) { //process your response if successful do what you want in your task } @Override public void failure(RetrofitError retrofitError) { retrofitError.printStackTrace(); //to see if you have errors } }); } 

Надеюсь, это поможет вам, хотя на самом деле это самый простой способ использовать модификацию.

Взгляните на этот отличный блог об использовании Retrofit вместе с Otto, обе библиотеки находятся на Square.

http://www.mdswanson.com/blog/2014/04/07/durable-android-rest-clients.html

Основная идея заключается в том, что вы будете ссылаться на объект «репозиторий» в своем классе Application. Этот объект будет иметь методы, которые «подписываются» на остальные запросы api. Когда кто-либо будет принят, он сделает правильный повторный выбор, а затем «отправит» ответ, который затем может быть «подписан» другим компонентом (например, деятельностью, которая сделала запрос).

Как только вы все правильно настроите, доступ к данным через ваш api для вашего отдыха станет очень простым. Например, создание запроса данных будет выглядеть примерно так:

  mBus.post(new GetMicropostsRequest(mUserId)); 

И потребление данных будет выглядеть примерно так:

 @Subscribe public void onGetUserProfileResponse(GetUserProfileResponse event) { mView.setUserIcon("http://www.gravatar.com/avatar/" + event.getGravatar_id()); mView.setUserName(event.getName()); } 

Это требует немного усилий, но в конце концов становится «тривиальным» доступ ко всему, что вам нужно, из нашего бэкэнда через Rest.

Вы можете попытаться сохранить ссылки на свой api внутри своего класса приложения. Затем вы можете получить его экземпляр из любой активности или фрагмента и получить api оттуда. Это звучит немного странно, но это может быть простая альтернатива DI. И если вы будете хранить ссылки только в своем классе приложения, это не будет своего рода божественным объектом

UPD: http://square.github.io/retrofit/ – вот некоторая документация, это может быть полезно

Использование RetroFit очень просто.

  • Добавьте dependecy в build.gradle.

      compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'com.squareup.okhttp:okhttp:2.4.0' 
  • Создайте интерфейс для всех методов http.

  • Скопируйте свой json-выход и создайте класс pojo, чтобы получить json вашего
    Ответ, вы можете сделать pojo с сайта JsonSchema2pojo .

  • Сделайте адаптер и вызовите свой метод

    Для полной демонстрации попробуйте этот урок. Обновите Android-пример.

Оформить заказ этого приложения, которое демонстрирует интеграцию Retrofit с API-интерфейсом Google Tasks.

https://github.com/sschendel/SyncManagerAndroid-DemoGoogleTasks

Существуют примеры Retrofit api (TaskApi), используемые в Activity AsyncTask в MainActivity, а также примеры использования в Sync Adapter в фоновом режиме.

Стратегия из статьи, опубликованной в ответе @ nPn, вероятно, является более элегантным решением, но вы можете хотя бы взглянуть на другой рабочий пример.

Во-первых, положить все в MainActivity будет плохой практикой, и у вас будет объект Бога .

Документация на сайте « Дооснащение» фантастична, поэтому я собираюсь прочитать ваш вопрос о том, как структурировать проект. Я написал очень маленькое приложение для демонстрационных целей. Он загружает кошек из API кошки и должен быть довольно простым, чтобы следить за тем, что происходит.

В нем приведен пример использования JSON или XML для анализа данных из службы. Вы можете найти его на странице https://github.com/codepath/android_guides/wiki/Consuming-APIs-with-Retrofit

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

Я нахожу эти обучающие программы AndroidHive , CodePath полезен

Я кратко опишу, что я узнал.

Шаг 1: добавьте эти три dependencies to build.gradle и Add Internet permission для Manifest

 compile 'com.google.code.gson:gson:2.6.2' // for string to class conversion. Not Compulsory compile 'com.squareup.retrofit2:retrofit:2.1.0'// compulsory compile 'com.squareup.retrofit2:converter-gson:2.1.0' //for retrofit conversion 

Добавьте их в манифест

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

Шаг 2 Creae ApiClient и ApiInterface.

 public class ApiClient { public static final String BASE_URL = "http://yourwebsite/services/"; private static Retrofit retrofit = null; public static Retrofit getClient() { if (retrofit==null) { retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } } 

Где ApiInterface.class

 public interface ApiInterface { // getting same data in three different ways. @GET("GetCompanyDetailByID") Call<CompanyResponse> getDetailOfComapanies(@Query("CompanyID") int companyID); @GET("GetCompanyDetailByID") Call<ResponseBody> getRawDetailOfCompanies(@Query("CompanyID") int companyID); @GET("{pathToAdd}") Call<CompanyResponse> getDetailOfComapaniesWithPath(@Path("pathToAdd") String pathToAppend, @Query("CompanyID") int companyID); } 

И назовите эту услугу, как

 ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); Call<CompanyResponse> companyResponseCall = apiService.getDetailOfComapanies(2); //Call<CompanyResponse> companyResponseCall = apiService.getDetailOfComapaniesWithPath("GetCompanyDetailByID",2); companyResponseCall.enqueue(new Callback<CompanyResponse>() { @Override public void onResponse(Call<CompanyResponse> call, Response<CompanyResponse> response) { CompanyResponse comapnyResponse = response.body(); Boolean status = comapnyResponse.getStatus(); } @Override public void onFailure(Call<CompanyResponse> call, Throwable t) { } }); 

Для получения Raw Json String

 Call<ResponseBody> call = apiService.getRawDetailOfCompanies(2); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { String jsonStr = response.body().string(); if(!jsonStr.isEmpty()){ Gson gson = new Gson(); JSONObject jObject = new JSONObject(jsonStr).getJSONObject("data"); //1st Method Data dataKiType = gson.fromJson(jObject.toString(), Data.class); dataKiType.getCompanyDetail(); //2nd method for creaing class or List at runTime Type listType = new TypeToken<Data>(){}.getType(); Data yourClassList = new Gson().fromJson(jObject.toString(), listType); yourClassList.getCompanyDetail(); } e.printStackTrace(); } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { } }); 

Вы можете создать свой бизнес-объект, используя http://www.jsonschema2pojo.org/ , просто вставив json. И выбор типа источника для JSON и стиля аннотации для GSon

Нашел небольшой, но полный и краткий пример на https://github.com/square/retrofit/tree/master/samples

Начинающие находят это немного пугающим, чтобы изучить модернизацию. Я подготовил учебник, который упростит кривую обучения. Дополнительную информацию см. В разделе « Дооснащение андроида» .

Работает

Введите описание изображения здесь Пакет com.keshav.gmailretrofitexampleworking.network;

 import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class ApiClient { public static final String BASE_URL = "http://api.androidhive.info/json/"; private static Retrofit retrofit = null; public static Retrofit getClient() { if (retrofit == null) { retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } } ============================================== package com.keshav.gmailretrofitexampleworking.network; import com.keshav.gmailretrofitexampleworking.models.Message; import java.util.List; import retrofit2.Call; import retrofit2.http.GET; public interface ApiInterface { @GET("inbox.json") Call<List<Message>> getInbox(); } 

Compile 'com.google.code.gson: gson: 2.6.2'

 compile 'com.squareup.retrofit2:retrofit:2.0.2' compile 'com.squareup.retrofit2:converter-gson:2.0.2' 

================================================== ===

Переадресация вызова 2 APi внутри onCreate

 private void getInbox() { swipeRefreshLayout.setRefreshing(true); ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); Call<List<Message>> call = apiService.getInbox(); call.enqueue(new Callback<List<Message>>() { @Override public void onResponse(Call<List<Message>> call, Response<List<Message>> response) { // clear the inbox messages.clear(); // add all the messages // messages.addAll(response.body()); // TODO - avoid looping // the loop was performed to add colors to each message Log.e("keshav","response" +response.body()); for (Message message : response.body()) { // generate a random color // TODO keshav Generate Random Color Here message.setColor(getRandomMaterialColor("400")); messages.add(message); } mAdapter.notifyDataSetChanged(); swipeRefreshLayout.setRefreshing(false); } @Override public void onFailure(Call<List<Message>> call, Throwable t) { Toast.makeText(getApplicationContext(), "Unable to fetch json: " + t.getMessage(), Toast.LENGTH_LONG).show(); swipeRefreshLayout.setRefreshing(false); } }); } 

Исходный код https://drive.google.com/open?id=0BzBKpZ4nzNzUVFRnVVkzc0JabUU

https://drive.google.com/open?id=0BzBKpZ4nzNzUc2FBdW00WkRfWW8

Разработка собственной безопасной HTTP-библиотеки для интерфейса с REST API может быть настоящей болью: вам нужно обрабатывать многие аспекты, такие как создание соединений, кэширование, повторная попытка неудачных запросов, потоковая обработка, анализ ответов, обработка ошибок и многое другое. С другой стороны, дооснащение – это хорошо спланированная, документированная и проверенная библиотека, которая сэкономит вам много драгоценного времени и головных болей.

Compile 'com.google.code.gson: gson: 2.6.2'

Compile 'com.squareup.retrofit2: retrofit: 2.1.0' // обязательный

Compile 'com.squareup.retrofit2: converter-gson: 2.1.0' // для модифицированного преобразования