压缩包

HttpbinService.java

MainActivity.java

一、Retrofit简介

A type-safe HTTP client for Android and Java。封装了OkHttp,也是由Square公司贡献的一个处理网络请求的开源项目。

  1. [https://github.com/square/retrofit](https://github.com/square/retrofit)

1.依赖包:

  1. implementation 'com.squareup.retrofit2:retrofit:2.9.0'<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1574587/1625399278549-9de9c499-831a-4fa8-84cc-920d89577410.png#clientId=uda9bcb36-7a6d-4&from=paste&height=562&id=u01b00bd4&margin=%5Bobject%20Object%5D&name=image.png&originHeight=562&originWidth=1365&originalType=binary&ratio=1&size=98728&status=done&style=none&taskId=u4286eaf9-a05a-4004-92ad-b30bdf985b4&width=1365)

二、Retrofit基本使用一

  1. 服务器域名:[https://www.httpbin.org/](https://www.httpbin.org/)<br /> 接口:post<br /> 参数:username,possword<br /> 接口:get<br /> 参数:username,possword

1.根据接口创建Java接口:

image.png

三、Retrofit基本使用二

2.创建Retrofit配置,并生成接口实现类对象:

  1. Retrofit retrofit=new Retrofit.Builder().baseUrl("https://www.httpbin.org/").build();<br /> HttpbinService httpbinService=retrofit.create(HttpbinService.class);

3.接口实现类对象调用对应方法获得响应:

image.png

四、Retrofit实现的具体步骤:

1.创建retrofit请求的接口类

41.Retrofit的基本使用 - 图3

2.定义retrofit和请求的接口类

image.png

3.实现retrofit的post和callback方法

image.png

五、整体代码

1.HttpbinService接口类文件代码

  1. package com.example.networkdemo;
  2. import okhttp3.ResponseBody;
  3. import retrofit2.Call;
  4. import retrofit2.http.Field;
  5. import retrofit2.http.FormUrlEncoded;
  6. import retrofit2.http.GET;
  7. import retrofit2.http.POST;
  8. import retrofit2.http.Query;
  9. public interface HttpbinService {
  10. // https://www.httpbin.org/post password=value
  11. @POST("post")
  12. @FormUrlEncoded
  13. Call<ResponseBody> post(@Field("username") String username,@Field("password") String pwd);
  14. @GET("get")
  15. Call<ResponseBody> get(@Query("username") String username,@Query("password") String pwd);
  16. }

2.MainActivity文件代码

  1. package com.example.networkdemo;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.View;
  6. import org.jetbrains.annotations.NotNull;
  7. import java.io.IOException;
  8. import okhttp3.Call;
  9. import okhttp3.Callback;
  10. import okhttp3.FormBody;
  11. import okhttp3.OkHttpClient;
  12. import okhttp3.Request;
  13. import okhttp3.Response;
  14. import okhttp3.ResponseBody;
  15. import retrofit2.Retrofit;
  16. public class MainActivity extends AppCompatActivity {
  17. // 请求器
  18. private OkHttpClient okHttpClient;
  19. private static final String TAG="MainActivity";
  20. private Retrofit retrofit;
  21. private HttpbinService httpbinService;
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_main);
  26. okHttpClient = new OkHttpClient();
  27. retrofit = new Retrofit.Builder().baseUrl("https://www.httpbin.org/").build();
  28. httpbinService = retrofit.create(HttpbinService.class);
  29. }
  30. public void getSync(View view) {
  31. new Thread(){
  32. @Override
  33. public void run() {
  34. // 请求对象
  35. Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
  36. // 准备好请求的Call对象
  37. Call call = okHttpClient.newCall(request);
  38. try {
  39. // 请求得到的响应
  40. Response response = call.execute();
  41. Log.i(TAG,"getSync:"+response.body().string());
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }.start();
  47. }
  48. public void getASync(View view) {
  49. Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&a=2").build();
  50. // 准备好请求的Call对象
  51. Call call = okHttpClient.newCall(request);
  52. //异步请求
  53. call.enqueue(new Callback() {
  54. @Override
  55. public void onFailure(@NotNull Call call, @NotNull IOException e) {
  56. }
  57. @Override
  58. public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
  59. if (response.isSuccessful()){
  60. Log.i(TAG,"getASync:"+response.body().string());
  61. }
  62. }
  63. });
  64. }
  65. public void postSync(View view) {
  66. new Thread(){
  67. @Override
  68. public void run() {
  69. FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
  70. Request request = new Request.Builder().url("https://www.httpbin.org/post").post(formBody).build();
  71. // 准备好请求的Call对象
  72. Call call = okHttpClient.newCall(request);
  73. try {
  74. // 请求得到的响应
  75. Response response = call.execute();
  76. Log.i(TAG,"postSync:"+response.body().string());
  77. } catch (IOException e) {
  78. e.printStackTrace();
  79. }
  80. }
  81. }.start();
  82. }
  83. public void postASync(View view) {
  84. // FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
  85. // Request request = new Request.Builder().url("https://www.httpbin.org/post").post(formBody).build();
  86. // // 准备好请求的Call对象
  87. // Call call = okHttpClient.newCall(request);
  88. // //异步请求
  89. // call.enqueue(new Callback() {
  90. // @Override
  91. // public void onFailure(@NotNull Call call, @NotNull IOException e) {
  92. //
  93. // }
  94. //
  95. // @Override
  96. // public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
  97. // if (response.isSuccessful()) {
  98. // Log.i(TAG, "postASync:" + response.body().string());
  99. // }
  100. //
  101. // }
  102. // });
  103. // retrofit的使用
  104. retrofit2.Call<ResponseBody> call = httpbinService.post("lance", "123");
  105. call.enqueue(new retrofit2.Callback<ResponseBody>() {
  106. @Override
  107. public void onResponse
  108. (retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
  109. try {
  110. Log.i(TAG, "postASync:" + response.body().string());
  111. } catch (IOException e) {
  112. e.printStackTrace();
  113. }
  114. }
  115. @Override
  116. public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
  117. }
  118. });
  119. }
  120. }

3.效果图:

image.png

六、常见错误

1.retrofit运行时出现以下错误:

image.png

2.静态接口需要在Java 8 下才支持使用,所以我们要使用静态接口,就需要在app的build.gradle文件中配置声明,使用Java 8编译。所以需要加入以下代码来声明:

  1. compileOptions {
  2. sourceCompatibility JavaVersion.VERSION_1_8
  3. targetCompatibility JavaVersion.VERSION_1_8
  4. }

3.修改如下图所示:

image.png