Retrofit-2.0版本后,内置已经集成了OKHttp,在使用Retrofit的时候 看似是Retrofit去网络请求的 实际上Retrofit只是封装,所以不要以为Retrofit是网络请求框架,Retrofit是网络封装框架,封装网络请求接口,封装解析等操作, 真正请求还是交给了OKHttp
代码结构:
第一步:在app/build.gradle添加支持库:
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) /*implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'*/ implementation 'com.squareup.retrofit2:converter-gson:2.0.2' // 用Gson解析json的转换器 implementation 'com.android.support:appcompat-v7:28.0.0' // Retrofit库 implementation 'com.squareup.retrofit2:retrofit:2.0.2' // Okhttp库 // compile 'com.squareup.okhttp3:okhttp:3.1.2' }
第二步:封装服务器响应后的Bean实体:
2.1)封装POST响应后的Bean实体>>PostTranslation
package ldl.cn.ldldemo.post; import java.util.List; public class PostTranslation { /** * 以下这些字段为什么要这样写,是由于服务器规定的,内部Gson解析的时候会对应字段的,所以必须这样写 */ private String type; private int errorCode; private int elapsedTime; private List<List<TranslateResultBean>> translateResult; public String getType() { return type; } public void setType(String type) { this.type = type; } public int getErrorCode() { return errorCode; } public void setErrorCode(int errorCode) { this.errorCode = errorCode; } public int getElapsedTime() { return elapsedTime; } public void setElapsedTime(int elapsedTime) { this.elapsedTime = elapsedTime; } public List<List<TranslateResultBean>> getTranslateResult() { return translateResult; } public void setTranslateResult(List<List<TranslateResultBean>> translateResult) { this.translateResult = translateResult; } /** * 定义结果Bean */ public static class TranslateResultBean { /** * src = xue * tgt = sb */ private String src; private String tgt; public String getSrc() { return src; } public void setSrc(String src) { this.src = src; } public String getTgt() { return tgt; } public void setTgt(String tgt) { this.tgt = tgt; } } }
2.2)封装GET响应后的Bean实体>>GetTranslation
package ldl.cn.ldldemo.get; public class GetTranslation { /** * 以下这些字段为什么要这样写,是由于服务器规定的,内部Gson解析的时候会对应字段的,所以必须这样写 */ private int status; public content content; private static class content { private String from; private String to; private String vendor; private String out; private int errNo; /*** * ------------- 新增toString(); 为了看日志 */ @Override public String toString() { return "content{" + "from='" + from + '\'' + ", to='" + to + '\'' + ", vendor='" + vendor + '\'' + ", out='" + out + '\'' + ", errNo=" + errNo + '}'; } } /*** * ------------- 新增toString(); 为了看日志 */ @Override public String toString() { return "GetTranslation{" + "status=" + status + ", content=" + content + '}' + "\n static class content的toString():" + content.toString(); } }
第三步:描述请求的接口Interface
3.1:描述POST请求的接口 IRequest
package ldl.cn.ldldemo.post; import retrofit2.Call; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; public interface IRequest { @POST("translate?doctype=json&jsonversion=&type=&keyfrom=&model=&mid=&imei=&vendor=&screen=&ssid=&network=&abtest=") @FormUrlEncoded Call<PostTranslation> getCall(@Field("i") String targetSentence); //采用@Post表示Post方法进行请求(传入部分url地址) // 采用@FormUrlEncoded注解的原因:API规定采用请求格式x-www-form-urlencoded,即表单形式 // 需要配合@Field使用 }
3.2:描述GET请求的接口 IGetRequest
package ldl.cn.ldldemo.get; import retrofit2.Call; import retrofit2.http.GET; /** * 请求接口 */ public interface IGetRequest { @GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20world") Call<GetTranslation> getCall(); // 注解里传入 网络请求 的部分URL地址 // getCall()是接受网络请求数据的方法 }
第四步:具体Post、Get 操作:
package ldl.cn.ldldemo; import android.app.Activity; import android.os.Bundle; import android.support.annotation.Nullable; import android.util.Log; import android.view.View; import ldl.cn.ldldemo.get.GetTranslation; import ldl.cn.ldldemo.get.IGetRequest; import ldl.cn.ldldemo.post.IRequest; import ldl.cn.ldldemo.post.PostTranslation; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class MainActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { } /** * POST-请求的方式 * @param view */ public void startPostRequest(View view) { /** * 创建Retrofit对象 */ Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://fanyi.youdao.com/") // 在这里设置网络访问的URL .addConverterFactory(GsonConverterFactory.create()) // 在这里设置 .build(); /** * 创建网络请求接口 */ IRequest iRequest = retrofit.create(IRequest.class); Call<PostTranslation> call = iRequest.getCall("study"); call.enqueue(new Callback<PostTranslation>() { @Override public void onResponse(Call<PostTranslation> call, Response<PostTranslation> response) { // 代表请求成功 Log.d("@@@@@@", "翻译的结果是:" + response.body().getTranslateResult().get(0).get(0).getTgt()); } @Override public void onFailure(Call<PostTranslation> call, Throwable t) { // 代表请求失败 Log.d("@@@@@@", "请求失败:" + t.getMessage()); } }); } /** * GET-请求的方式 * @param view */ public void startGetRequest(View view) { /** * 创建Retrofit */ Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://fy.iciba.com/") // 设置网络请求的URL .addConverterFactory(GsonConverterFactory.create()) // 设置为Gson解析 .build(); /** * 创建网络请求接口实例 */ IGetRequest iGetRequest = retrofit.create(IGetRequest.class); /** * GET请求方式 请求 */ Call<GetTranslation> call = iGetRequest.getCall(); // 采用异步 call.enqueue(new Callback<GetTranslation>() { @Override public void onResponse(Call<GetTranslation> call, Response<GetTranslation> response) { // 代表请求成功 Log.d("@@@", "request Success" + response.body().toString() + " \n"); } @Override public void onFailure(Call<GetTranslation> call, Throwable t) { // 代表请求失败 Log.d("@@@", "request Failure" + t.getMessage()); } }); } }
activity的布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始执行Post" android:onClick="startPostRequest" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始执行Get" android:onClick="startGetRequest" /> </LinearLayout>
执行结果: