Retrofit我们可以理解为是网络请求的一部分:
- 类似于我们之前用的HttpClient,HttpConnection,Okhttp等
- 但是它的请求的特点和上面的有些差别
首先看下效果图:
由于图片本身限制为2W,所以简单补充一下每个Button按钮所请求的(主要是请求网址的不同形式差别)差别
- 进行一个简单请求,没有参数等的变化,是一个完整的请求网络地址,我这里请求的是:http://www.baidu.com
- 第二个请求的类型:http://www.baidu.com/daily/view,这里的view是变量,所以该请求分为:基本url:http://www.baidu.com 和后缀url:daily/view
- 当我们的请求的网址类型为http://v.juhe.cn/todayOnhistory/queryEvent.php?key=69a7eeba7869f8bdcdee7b2bc3bb5aa2&date=1/16 时候,也就是请求参数含有类似:key,date等变量请求参数时
- 当我们请求时我们的key,date可能不止一组,可能会有很多,所以我们有必要通过Map集合来进行管理参数
- Retrofit封装Get请求
- Retrofit封装Post请求
导入依赖包
- 第一个Retrofit基本包
- 指定我们请求数据转换成String所要导入的包
- RetrofitGson解析
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit2:converter-scalars:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
项目目录结构
- bean里面的Status是我们请求的网络结果生成的对象
- 接口类是我们Retrofit很显著的一个特点,ProjectAPI应用于封装,RequestApi处理我们的前四个按钮
- 管理类,也是我们的封装所需的类
- 我们的Activity
布局文件activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/btn_requestBaidu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Retrofit请求百度首页" />
<Button
android:id="@+id/btn_baiduKnow"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Retrofit请求百度知道" />
<Button
android:id="@+id/btn_getStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Retrofit-get请求Status" />
<Button
android:id="@+id/btn_postStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Retrofit-post请求Status" />
<Button
android:id="@+id/btn_getpackage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Retrofit封装get请求" />
<Button
android:id="@+id/btn_postpackage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Retrofit封装post请求" />
</LinearLayout>
RequestApi代码
public interface RequestAPI
{
/*
//http://v.juhe.cn/todayOnhistory/queryEvent.php?key=69a7eeba7869f8bdcdee7b2bc3bb5aa2&date=1/16
* get请求方式
* */
@GET
Call<String> getBaidu(@Url String url);
/*
* https://zhidao.www.baidu.com/daily/view
*
* 基本的url是:https://zhidao.www.baidu.com ,我们需要对后面的实行拼接
*
* */
//{v}代表所需要变化的path参数,比如id等,是变量
//@Path("v") String v) 代表替换掉v,用String 后面的v代替,不全到daily后
/*
* 路径拼接的形式
* */
@GET("daily/{v}")
Call<String> getBaiduKnow(@Path("v") String v);
/*
* http://v.juhe.cn/todayOnhistory/queryEvent.php?key=69a7eeba7869f8bdcdee7b2bc3bb5aa2&date=1/16
* */
@GET("todayOnhistory/queryEvent.php")
Call<Status> getStatus(@Query("key") String key,@Query("date") String date);
@GET("todayOnhistory/queryEvent.php")
Call<Status> getStatusMap(@QueryMap Map<String,String> map);
@POST("todayOnhistory/queryEvent.php")
Call<Status> postStatus(@Field("key")String key,@Field("date") String date);
//postmap必须指定
@FormUrlEncoded
@POST("todayOnhistory/queryEvent.php")
Call<Status> postStatusMap(@FieldMap Map<String,String> map);
}
MainActivity
“`
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button btnRequestBaidu,btnBaiduKnow,btnGetStatus,btnPostStatus,btngetPackage,btnpostPackage;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//控件初始化
initView();
}
private void initView()
{
//请求百度首页按钮
btnRequestBaidu= (Button) findViewById(R.id.btn_requestBaidu);
btnRequestBaidu.setOnClickListener(this);
//请求百度知道首页按钮
btnBaiduKnow= (Button) findViewById(R.id.btn_baiduKnow);
btnBaiduKnow.setOnClickListener(this);
//Retrofit-get请求Status按钮
btnGetStatus= (Button) findViewById(R.id.btn_getStatus);
btnGetStatus.setOnClickListener(this);
//Retrofit-post请求Status按钮
btnPostStatus= (Button) findViewById(R.id.btn_postStatus);
btnPostStatus.setOnClickListener(this);
btngetPackage= (Button) findViewById(R.id.btn_getpackage);
btngetPackage.setOnClickListener(this);
btnpostPackage= (Button) findViewById(R.id.btn_postpackage);
btnpostPackage.setOnClickListener(this);
}
@Override
public void onClick(View view)
{
switch (view.getId())
{
case R.id.btn_requestBaidu:
//先创建Retrofit对象 //设置Url
//addConverterFactory添加转换形式,ScalarsConverterFactory.create指定转换类型为String
Retrofit retrofit=new Retrofit.Builder().baseUrl("http://www.baidu.com").addConverterFactory(ScalarsConverterFactory.create()).build();
//将请求的API转成Java接口
RequestAPI requestApi= retrofit.create(RequestAPI.class);
//获取调用对象
Call<String> baidu= requestApi.getBaidu("http://www.baidu.com");
//拿到Call對象進行請求,分为同步与异步
//同步请求必须放在子线程中,所以不是首选
// try {
// baidu.execute();
// } catch (IOException e) {
// e.printStackTrace();
// }
//使用异步请求
baidu.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
//得到请求的http文本
Toast.makeText(MainActivity.this,response.body(), Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<String> call, Throwable t) {
//得到抛出的异常信息
Toast.makeText(MainActivity.this,t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
break;
case R.id.btn_baiduKnow:
//先创建Retrofit对象 //设置Url //添加转换形式 //指定转换类型为String
Retrofit retrofit1=new Retrofit.Builder().baseUrl("http://www.baidu.com").addConverterFactory(ScalarsConverterFactory.create()).build();
//将请求的API转成Java接口
RequestAPI requestApi1= retrofit1.create(RequestAPI.class);
//获取调用对象
//view 指的是我们具体添加的path,替换掉接口中的v
Call<String> know= requestApi1.getBaiduKnow("view");
//拿到Call對象進行請求,分为同步与异步
//同步请求必须放在子线程中,所以不是首选
// try {
// baidu.execute();
// } catch (IOException e) {
// e.printStackTrace();
// }
//使用异步请求
know.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
//得到请求的http文本
Toast.makeText(MainActivity.this,response.body(), Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<String> call, Throwable t) {
//得到抛出的异常信息
Toast.makeText(MainActivity.this,t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
break;
case R.id.btn_getStatus:
Retrofit retrofit2=new Retrofit.Builder().baseUrl("http://v.juhe.cn/").addConverterFactory(GsonConverterFactory.create()).build();
RequestAPI requestAPI=retrofit2.create(RequestAPI.class);
Call<Status> status=requestAPI.getStatus("69a7eeba7869f8bdcdee7b2bc3bb5aa2","1/16");
status.enqueue(new Callback<Status>() {
@Override
public void onResponse(Call<Status> call, Response<Status> response)
{
Status status1=response.body();
Toast.makeText(MainActivity.this, status1.getResult().get(3).getTitle(), Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<Status> call, Throwable t)
{
Toast.makeText(MainActivity.this, "dsfefsdf", Toast.LENGTH_SHORT).show();
}
});
break;
case R.id.btn_postStatus:
Retrofit retrofit3=new Retrofit.Builder().baseUrl("http://v.juhe.cn/").addConverterFactory(GsonConverterFactory.create()).build();
RequestAPI requestAPI4=retrofit3.create(RequestAPI.class);
Map<String,String> map=new HashMap<String,String>();
map.put("key","69a7eeba7869f8bdcdee7b2bc3bb5aa2");
map.put("date","1/17");
Call<Status> statusCall=requestAPI4.postStatusMap(map);
statusCall.enqueue(new Callback<Status>() {
@Override
public void onResponse(Call<Status> call, Response<Status> response) {
Status status1=response.body();
Toast.makeText(MainActivity.this, status1.getResult().get(4).getTitle(), Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<Status> call, Throwable t) {
Toast.makeText(MainActivity.this, "dsfefsdf", Toast.LENGTH_SHORT).show();
}
});
break;
case R.id.btn_getpackage:
HttpManager.getMethod("http://v.juhe.cn/", "http://v.juhe.cn/todayOnhistory/queryEvent.php?key=69a7eeba7869f8bdcdee7b2bc3bb5aa2&date=1/16", new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
Toast.makeText(MainActivity.this, response.body(), Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
break;
case R.id.btn_postpackage:
Map<String,String> map1=new HashMap<String,String>();
map1.put("key","69a7eeba7869f8bdcdee7b2bc3bb5aa2");
map1.put("date","1/15");
HttpManager.postMethod("http://v.juhe.cn/", "todayOnhistory/queryEvent.php", map1, new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
Toast.makeText(MainActivity.this, response.body(), Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
break;
default:
break;
}
}
}