简体   繁体   English

在 Android 中使用 Retrofit

[英]Using Retrofit in Android

I have an android app that has 3 activities:我有一个具有 3 个活动的 android 应用程序:

  1. A login activity登录活动
  2. A tasks acivity where all tasks pertaining to a user are displayed (Populated using an Array Adapter)显示与用户有关的所有任务的任务活动(使用阵列适配器填充)
  3. A task_details activity which results from clicking a task on the list通过单击列表中的任务产生的 task_details 活动

I have to consume REST Apis.我必须消耗 REST APIs。 The research I have done so far directs me to use Retrofit.到目前为止我所做的研究指导我使用 Retrofit。 I checked how to use it and found out that:我检查了如何使用它并发现:

  1. Set the base URL in the Main Activity (Mine is the Login Activity)在主活动中设置基础 URL (我的是登录活动)
  2. I need to create a API class and define my functions using annotations.我需要创建一个 API class 并使用注释定义我的函数。
  3. Use the class Rest Adapter in the Activity and define Callbacks.在活动中使用 class Rest 适配器并定义回调。

Had my app been a single activity app, I would have crunched everything in my MainActivity.java but I don't know how and where to put all the code from steps 1,2,3 for use in my 3 activities.Could you please help by telling how to use Retrofit in my app.如果我的应用程序是单个活动应用程序,我会在 MainActivity.java 中处理所有内容,但我不知道如何以及在何处将步骤 1、2、3 中的所有代码用于我的 3 个活动。请问通过告诉如何在我的应用程序中使用 Retrofit 来提供帮助。 Thanks a lot.非常感谢。

Specifically, I need network calls to: 1. Login the user 2. Get all the tasks of the user.具体来说,我需要网络调用: 1. 登录用户 2. 获取用户的所有任务。 And for both I would be using a given REST api.对于两者,我将使用给定的 REST api。

*********************************************
          Calling Api USing Retrofit
*********************************************
**Dependancies** :-
      implementation 'com.android.support:recyclerview-v7:27.1.1'
        implementation 'com.squareup.picasso:picasso:2.5.2'
        implementation 'com.android.support:cardview-v7:27.1.1'
    enter code here
**Model**
use the Pozo class

**Api Call**
 -> getLogin()    // use the method



  //API call for Login
    private void getLogin()
    {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        AsyncHttpClient client = new AsyncHttpClient();
        RequestParams requestParams = new RequestParams();
        requestParams.put("email_id", edit_email.getText().toString());
        requestParams.put("password", edit_password.getText().toString());
        Log.e("", "LOGIN URL==>" + Urls.LOGIN + requestParams);
        Log.d("device_token", "Device_ Token" + FirebaseInstanceId.getInstance().getToken());
        client.post(Urls.LOGIN, requestParams, new JsonHttpResponseHandler() {
            @Override
            public void onStart() {
                super.onStart();
                ShowProgress();
            }

            @Override
            public void onFinish() {
                super.onFinish();
                Hideprogress();

            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                super.onSuccess(statusCode, headers, response);
                Log.e("", "Login RESPONSE-" + response);
                Login login = new Gson().fromJson(String.valueOf(response), Login.class);
                edit_email.setText("");
                edit_password.setText("");
                if (login.getStatus().equals("true")) {
                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                    MDToast mdToast = MDToast.makeText(SignInActivity.this, String.valueOf("User Login Successfully!"),
                            MDToast.LENGTH_SHORT, MDToast.TYPE_SUCCESS);
                    mdToast.show();
                    Utils.WriteSharePrefrence(SignInActivity.this, Util_Main.Constant.EMAIL, login.getData().getEmailId());
                    Utils.WriteSharePrefrence(SignInActivity.this, Constant.USERID, login.getData().getId());

                    Utils.WriteSharePrefrence(SignInActivity.this, Constant.USERNAME, login.getData().getFirstName());
                    Utils.WriteSharePrefrence(SignInActivity.this, Constant.PROFILE, login.getData().getProfileImage());
                    hideKeyboard(SignInActivity.this);
                    Intent intent = new Intent(SignInActivity.this, DashboardActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(intent);
                    finish();
                } else {
                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                    MDToast mdToast = MDToast.makeText(SignInActivity.this, String.valueOf("Login Denied"),
                            MDToast.LENGTH_SHORT, MDToast.TYPE_ERROR);
                    mdToast.show();
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                super.onFailure(statusCode, headers, responseString, throwable);
                Log.e("", throwable.getMessage());
                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                MDToast mdToast = MDToast.makeText(SignInActivity.this, "Something went wrong",
                        MDToast.LENGTH_SHORT, MDToast.TYPE_ERROR);
                mdToast.show();
            }
        });
    }

Using Retrofit is quite simple and straightforward.使用 Retrofit 非常简单明了。

First of all you need to add retrofit to your project, as example with Gradle build sytem.首先,您需要为项目添加改造,例如 Gradle 构建系统。

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

another way you can download .jar and place it to your libs folder.另一种方法是您可以下载 .jar 并将其放置到您的 libs 文件夹中。

Then you need to define interfaces that will be used by Retrofit to make API calls to your REST endpoints.然后您需要定义接口,Retrofit 将使用这些接口对您的 REST 端点进行 API 调用。 For example for users:例如对于用户:

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

}

Ok.好的。 Now you have defined your API interface an you can try to use it.现在您已经定义了 API 接口,您可以尝试使用它。

To start you need to create an instance of RestAdapter and set base url of your API back-end.首先,您需要创建一个RestAdapter实例并设置 API 后端的基本 URL。 It's also quite simple:这也很简单:

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

YourUsersApi yourUsersApi = restAdapter.create(YourUsersApi.class);

Here Retrofit will read your information from interface and under the hood it will create RestHandler according to meta-info your provided which actually will perform HTTP requests.这里 Retrofit 将从界面中读取您的信息,并在后台根据您提供的元信息创建RestHandler ,它实际上将执行 HTTP 请求。

Then under the hood, once response is received, in case of json api your data will be transformed to your model using Gson library so you should be aware of that fact that limitations that are present in Gson are actually there in Retrofit.然后在后台,一旦收到响应,在 json api 的情况下,您的数据将使用 Gson 库转换为您的模型,因此您应该意识到 Gson 中存在的限制实际上存在于 Retrofit 中的事实。

To extend/override process of serialisers/deserialisation your response data to your models you might want to provide your custom serialisers/deserialisers to retrofit.要扩展/覆盖序列化器/反序列化您对模型的响应数据的过程,您可能需要提供自定义序列化器/反序列化器进行改造。

Here you need to implement Converter interface and implement 2 methods fromBody() and toBody() .这里需要实现 Converter 接口并实现fromBody()toBody() 2个方法。

Here is example:这是示例:

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

And now you need to enable your custom adapters, if it was needed by using setConverter() on building RestAdapter现在您需要启用您的自定义适配器,如果需要通过在构建 RestAdapter 时使用setConverter()

Ok.好的。 Now you are aware how you can get your data from server to your Android application.现在您知道如何将数据从服务器获取到您的 Android 应用程序。 But you need somehow mange your data and invoke REST call in right place.但是您需要以某种方式管理您的数据并在正确的位置调用 REST 调用。 There I would suggest to use android Service or AsyncTask or loader or rx.java that would query your data on background thread in order to not block your UI.在那里,我建议使用 android Service 或 AsyncTask 或 loader 或 rx.java,它们会在后台线程上查询您的数据,以免阻塞您的 UI。

So now you can find the most appropriate place to call所以现在你可以找到最合适的地方打电话

SomeUserModel yourUser = yourUsersApi.fetchUser("someUsers")

to fetch your remote data.获取您的远程数据。

I have just used retrofit for a couple of weeks and at first I found it hard to use in my application.我刚刚使用了几个星期的改造,起初我发现它很难在我的应用程序中使用。 I would like to share to you the easiest way to use retrofit in you application.我想与您分享在您的应用程序中使用改造的最简单方法。 And then later on if you already have a good grasp in retrofit you can enhance your codes(separating your ui from api and use callbacks) and maybe get some techniques from the post above.然后,如果您已经很好地掌握了改造,您可以增强您的代码(将您的 ui 与 api 分开并使用回调),并且可能从上面的帖子中获得一些技术。

In your app you have Login,Activity for list of task,and activity to view detailed task.在您的应用程序中,您有登录、任务列表的活动和查看详细任务的活动。

First thing is you need to add retrofit in your app and theres 2 ways, follow @artemis post above.第一件事是你需要在你的应用程序中添加改造,有两种方法,按照上面的@artemis 帖子。

Retrofit uses interface as your API. Retrofit 使用接口作为你的 API。 So, create an interface class.所以,创建一个接口类。

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

}

Create another interface class to hold all your BASE ADDRESS of your api创建另一个接口类来保存 api 的所有基地址

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

In your Login activity create a method to handle the retrofit在您的登录活动中创建一个方法来处理改造

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

In your MainActivityList在您的 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
        }
    });
}

In your Detailed List在您的详细清单中

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

Hope this would help you though its really the simplest way to use retrofit.希望这会对您有所帮助,尽管它确实是使用改造的最简单方法。

Take a look at this , excellent blog on using Retrofit in conjunction with Otto, both libraries are from Square.看看这个关于将 Retrofit 与 Otto 结合使用的优秀博客,这两个库都来自 Square。

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

The basic idea is that you will hold a reference to a "repository" object in your Application class.基本思想是您将持有对 Application 类中“存储库”对象的引用。 This object will have methods that "subscribe" to rest api event requests.该对象将具有“订阅”休息 api 事件请求的方法。 When one is received it will make the proper Retrofit call, and then "post" the response, which can then be "subscribed" to by another component (such as the activity that made the request).当接收到一个时,它将进行适当的 Retrofit 调用,然后“发布”响应,然后可以由另一个组件(例如发出请求的活动)“订阅”。

Once you have this all setup properly, accessing data via your rest api becomes very easy.一旦你正确设置了这一切,通过你的rest api访问数据变得非常容易。 For example, making are request for data would look something like this :例如,对数据的请求看起来像这样:

    mBus.post(new GetMicropostsRequest(mUserId));

and consuming the data would look something like this:使用数据看起来像这样:

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

}

It takes a little bit of upfront effort, but in the end it becomes "trivial" to access anything you need from our backend via Rest.这需要一点前期的努力,但最终通过 Rest 从我们的后端访问您需要的任何东西变得“微不足道”。

You may try saving references to your api inside your application class.您可以尝试在应用程序类中保存对 api 的引用。 Then you can get it's instance from any activity or fragment and get api from there.然后你可以从任何活动或片段中获取它的实例,并从那里获取 api。 That sounds a little weird, but it may be a simple DI alternative.这听起来有点奇怪,但它可能是一个简单的 DI 替代方案。 And if you will only store references in your app class, it won't be a kind of god object如果你只在你的应用类中存储引用,它就不会是一种上帝对象

UPD: http://square.github.io/retrofit/ - here is some documentation, it might be useful UPD: http : //square.github.io/retrofit/ - 这里有一些文档,它可能有用

Using RetroFit is very easy.使用 RetroFit 非常简单。

  • Add dependecy in build.gradle.在 build.gradle 中添加依赖项。

     compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'com.squareup.okhttp:okhttp:2.4.0'
  • Make an Interface for all http methods.为所有 http 方法创建一个接口。

  • Copy your json output and create pojo class to recieve json of your复制您的 json 输出并创建 pojo 类以接收您的 json
    response, you can make pojo from JsonSchema2pojo site .响应,您可以从JsonSchema2pojo站点制作 pojo。

  • make an adapter and call your method制作一个适配器并调用您的方法

    for complete demo try this tutorial Retrofit Android example要获得完整的演示,请尝试本教程Retrofit Android example

Firstly, putting everything in MainActivity would be bad practice and you would end up with a God object .首先,把所有东西都放在 MainActivity 中是不好的做法,你最终会得到一个God 对象

The documentation on the Retrofit site is fantastic, so I'm going to read your question on how to structure the project. Retrofit 网站上的文档非常棒,所以我将阅读您关于如何构建项目的问题。 I wrote a very small app for demonstration purposes.我写了一个非常小的应用程序用于演示目的。 It loads cats from the cat API and should be fairly simple to follow what is happening.它从 cat API 加载猫,并且应该非常简单地了解正在发生的事情。

It has an example of using JSON or XML for the parsing of data from the service.它有一个使用 JSON 或 XML 解析来自服务的数据的示例。 You can find it at https://github.com/codepath/android_guides/wiki/Consuming-APIs-with-Retrofit您可以在https://github.com/codepath/android_guides/wiki/Consuming-APIs-with-Retrofit找到它

Hopefully you can extrapolate why I have structured it the way I have.希望你能推断出为什么我按照我的方式构建它。 I'm happy to answer any questions you have in the comments and update the answer.我很高兴回答您在评论中提出的任何问题并更新答案。

Checkout this app that demonstrates Retrofit integration to Google Tasks API.查看此应用程序,演示 Retrofit 与 Google Tasks API 的集成。

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

There are examples of Retrofit api (TaskApi) used within Activity AsyncTask in MainActivity, as well as examples of use within Sync Adapter in background service. MainActivity的Activity AsyncTask里面有Retrofit api(TaskApi)的例子,后台服务的Sync Adapter里面也有使用的例子。

The strategy from the article posted in @nPn's answer is probably a more elegant solution, but you can at least look at another working example. @nPn 的回答中发布的文章中的策略可能是一个更优雅的解决方案,但您至少可以查看另一个工作示例。

I find these tutorials AndroidHive , CodePath helpful我发现这些教程AndroidHiveCodePath很有帮助

I will briefly describe what I have learned.我将简要描述我所学到的。

Step 1 : Add these three dependencies to build.gradle and Add Internet permission to Manifest步骤1:将这三个dependencies to build.gradle添加dependencies to build.gradle并将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

Add them in Manifest在清单中添加它们

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

Step 2 Creae ApiClient and ApiInterface.步骤 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;
    }
}

where ApiInterface.class其中 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);
}

And call this service like并将此服务称为

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

For Getting Raw Json String获取原始 Json 字符串

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

You can create your business object using http://www.jsonschema2pojo.org/ by simply pasting json.您可以通过简单地粘贴 json 使用http://www.jsonschema2pojo.org/创建您的业务对象。 and selecting source type to JSON and Annotation Style to GSon并选择源类型为 JSON 和注释样式为 GSon

https://github.com/square/retrofit/tree/master/samples找到了一个小而完整且简洁的示例

Beginners find it little intimidating to learn retrofit.初学者发现学习改造并不可怕。 I have prepared a tutorial which will simplify the learning curve.我准备了一个教程,可以简化学习曲线。 See Retrofit android tutorial for more information.有关更多信息,请参阅Retrofit android 教程

Developing your own type-safe HTTP library to interface with a REST API can be a real pain: you have to handle many aspects, such as making connections, caching, retrying failed requests, threading, response parsing, error handling, and more.开发您自己的类型安全 HTTP 库以与 REST API 接口可能是一个真正的痛苦:您必须处理许多方面,例如建立连接、缓存、重试失败的请求、线程、响应解析、错误处理等等。 Retrofit, on the other hand, is a well-planned, documented and tested library that will save you a lot of precious time and headaches.另一方面,Retrofit 是一个精心规划、记录和测试的库,它将为您节省大量宝贵的时间和麻烦。

compile 'com.google.code.gson:gson:2.6.2'编译'com.google.code.gson:gson:2.6.2'

compile 'com.squareup.retrofit2:retrofit:2.1.0'// compulsory编译 'com.squareup.retrofit2:retrofit:2.1.0'// 强制

compile 'com.squareup.retrofit2:converter-gson:2.1.0' //for retrofit conversion compile 'com.squareup.retrofit2:converter-gson:2.1.0' //用于改造转换

First, add this lines to gradle file首先,将此行添加到 gradle 文件

compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.google.code.gson:gson:2.7'
    compile 'com.squareup:otto:1.3.8'
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

Then Create Objects in OnCreate of Activity然后在Activity的OnCreate中创建对象

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);    
OkHttpClient client= new OkHttpClient
                .Builder()
                .connectTimeout(30, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .addInterceptor(interceptor).build();
Gson gson=new GsonBuilder()
          .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
          .create();
Retrofit retrofit= new Retrofit.Builder()
                .baseUrl("url")
                .client(client)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

Create an iterface创建一个接口

public interface summaryListAPI {
//post
    @FormUrlEncoded
    @POST("index.php")
    Call<summaryList> post(
            @Field("status") String status,
            @Field("sox") String sox
    );
//get
@GET("yesbdeChatHistoryList/{userId}/")
    Call<List<ChatTabTwoResp>> getFriends(
            @Path("userId") int userId
    );
}

Create classes创建类

public class summaryList {
    @SerializedName("bookingSummary") @Expose private List<summaryListData> status = new ArrayList<summaryListData>();
}   

public class summaryListData {
    @SerializedName("date") @Expose private String date;
}

Add this Method to your activity将此方法添加到您的活动中

 public void apiSummaryListMain(final Retrofit retrofit) {
        retrofit.create(summaryListAPI.class).post("8547861657","100").enqueue(new Callback<summaryList>() {
            @Override
            public void onResponse(Call<summaryList> call, Response<summaryList> response) {
                if (response.isSuccessful()) {
                    progressBar.setVisibility(View.INVISIBLE);
                     List<summaryListData> summary_List= response.body().getStatus();                   
                }else{              
                }
            }
            @Override
            public void onFailure(Call<summaryList> call, Throwable t) {

            }
        });

    }

Its Working它的工作

在此处输入图片说明 package com.keshav.gmailretrofitexampleworking.network;包 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'编译'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'

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

Call Retrofit 2 APi inside onCreate在 onCreate 中调用 Retrofit 2 API

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

Source Code https://drive.google.com/open?id=0BzBKpZ4nzNzUVFRnVVkzc0JabUU源代码https://drive.google.com/open?id=0BzBKpZ4nzNzUVFRnVVkzc0JabUU

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

I just braked this problem in a very easy way you just need install a plugin and follow some steps to implement retrofit in any of your App.:我只是以一种非常简单的方式解决了这个问题,您只需要安装一个插件并按照一些步骤在您的任何应用程序中实施改造:

Already posted answer : Retrofit in android?已发布答案: 在 android 中进行改造?

Add (QAssist - Android Studio Plugin) Android plugin in your Android studio.在您的 Android 工作室中添加(QAssist - Android Studio 插件)Android 插件。 ( https://github.com/sakkeerhussain/QAssist ). https://github.com/sakkeerhussain/QAssist )。

Hope this will help you.希望这会帮助你。

Simple retrofit + okhttp integration using RxJava使用 RxJava 的简单改造 + okhttp 集成

public WebService apiService(Context context) {
    String mBaseUrl = context.getString(BuildConfig.DEBUG ? R.string.local_url : R.string.live_url);

    int cacheSize = 5 * 1024 * 1024; // 5 MB
    Cache cache = new Cache(context.getCacheDir(), cacheSize);

    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
    loggingInterceptor.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE);

    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .readTimeout(120, TimeUnit.SECONDS)
            .writeTimeout(120, TimeUnit.SECONDS)
            .connectTimeout(120, TimeUnit.SECONDS)
            .addInterceptor(loggingInterceptor)
            //.addNetworkInterceptor(networkInterceptor)
            .cache(cache)
            .build();

    return new Retrofit.Builder().baseUrl(mBaseUrl)
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build().create(WebService.class);

}

 public interface APIService { @POST(Constant.updateProfile) @FormUrlEncoded Call<ResponseBody> updateProfile( @Field("user_id") String user_id, @Field("first_name") String first_name, @Field("last_name") String last_name ); } public class RetrofitClient { private static Retrofit retrofit = null; public static Retrofit getClient(String baseUrl) { if (retrofit == null) { retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } } public class Body { // Check Status if Status True or False String status; String message; String checksum; } public interface OnBodyResponseListner { public void onSucces(Body response); public void onFailure(Body response); public void onBlankBody(Call<ResponseBody> call); } public static void setOnWebServiceCallListner(final Call<ResponseBody> t, final OnBodyResponseListner onBodyResponseListner) { t.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { try { call.cancel(); Gson gson = new GsonBuilder().serializeNulls().create(); String json = response.body().string(); Log.d(TAG, json + " ~ Response ~ " + json); Body body = gson.fromJson(json, Body.class); if (body.getStatus().equalsIgnoreCase("true")) { onBodyResponseListner.onSucces(body); } else { onBodyResponseListner.onFailure(body); } } catch (Exception e) { } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { onBodyResponseListner.onBlankBody(call); Log.d(TAG, "~ Response Message Blank ~ " + t.getMessage() + " \\n Localize Message ~ " + t.getLocalizedMessage() + " \\n" + t.getStackTrace().toString()); } }); } APIService mService = RetrofitClient.getClient(Constant.BASE_URL).create(APIService.class); Oprations.setOnWebServiceCallListner(mService.updateProfile("12", "first_name", "last,name" ), new OnBodyResponseListner() { @Override public void onSucces(Body response) { } @Override public void onFailure(Body response) { Toast.makeText(mContext, response.getMessage(), Toast.LENGTH_SHORT).show(); } @Override public void onBlankBody(Call<ResponseBody> call) { } }); }

  1. First, add the dependency - compile 'com.squareup.retrofit:retrofit:1.7.1'首先,添加依赖项 - compile 'com.squareup.retrofit:retrofit:1.7.1'
  2. Create retrofit instance class创建改造实例类
public class RetrofitClientInstance {
    private Context context;
    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
    private static Retrofit retrofit
    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(BuildConfig.SERVER_URL)
                    .client(getRequestHeader())
                    .addConverterFactory(GsonConverterFactory.create());
    public static HttpLoggingInterceptor setLogger() {
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        return logging;
    }
    public static <S> S createService(Class<S> serviceClass) {

        if (!httpClient.interceptors().isEmpty()) {

            httpClient.interceptors().clear();
        }
        httpClient.authenticator(new AccessTokenAuthenticator());
        httpClient.readTimeout(60,TimeUnit.SECONDS);
        httpClient.connectTimeout(60,TimeUnit.SECONDS);
        httpClient.addInterceptor(setLogger());
        httpClient.addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request original = chain.request();
                Request.Builder requestBuilder = original.newBuilder()
                        .header("LocalSystemDate", MyApplication.getInstance().getCurrentDateAndTimeWithTimeZone())
                        .addHeader("channel_id", AppConst.CHANNEL_ID)
                        .addHeader("Authorization", "Bearer" + " " + SharedPref.getsAccessToken())
                        .method(original.method(), original.body());
                Request request = requestBuilder.build();
                return chain.proceed(request);
            }
        });

        OkHttpClient client = httpClient.build();
        Retrofit retrofit = builder.client(client).build();
        return retrofit.create(serviceClass);
    }


    private static OkHttpClient getRequestHeader() {

        return new OkHttpClient.Builder()
                .readTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)
                .build();
    }
}

  1. Write the interface编写接口
public interface GetDataService {

    @Headers("Content-Type: application/json")
    @POST("login")
    Call<LoginResponseModel> loginUser(
          @Body LoginBodyModel loginBodyModel
    );

}
  1. Call the service呼叫服务
GetDataService service = RetrofitClientInstance.createService(GetDataService.class);

Call<LoginResponseModel> loginModelCall = service.loginUser(loginBodyModel);

loginModelCall.enqueue(new Callback<LoginResponseModel>() {
    @Override
    public void onResponse(Call<LoginResponseModel> call, Response<LoginResponseModel> response) {

    }

    @Override
    public void onFailure(Call<LoginResponseModel> call, Throwable t)  {

    }
});

You can do this with hilt你可以用刀柄做到这一点

@Module
@InstallIn(SingletonComponent::class)
object RestClientModule {

    @Provides
    @Singleton
    internal fun provideApiService(
        @WeatherRetrofit retrofit: Retrofit
    ): ApiService = retrofit.create(ApiService::class.java)





    @Provides
    @WeatherRetrofit
    @Singleton
    internal fun provideHiCityRetrofit(
        okHttpClient: OkHttpClient,
        moshi: Moshi
    ): Retrofit = Retrofit.Builder()
        .baseUrl(EndPoint.STAGE_BASE_URL)
        .client(okHttpClient)
        .addConverterFactory(ScalarsConverterFactory.create())
        .addConverterFactory(MoshiConverterFactory.create(moshi))
        .build()
}

You can checkout this Github Link with source-code avaible for login and signup API in android.您可以在 android 中查看此 Github 链接,其中包含可用于登录和注册 API 的源代码。 https://github.com/probelalkhan/kotlin-retrofit-tutorial/commits/master https://github.com/probelalkhan/kotlin-retrofit-tutorial/commits/master

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM