Retrofit的基本使用(poth,get)请求以及上传文件的
2019-02-17 本文已影响44人
君袅
了解
imageimage image
1.依赖(因为他是给予okhttp之上的,所以必须带着okhttp的依赖)一般使用的是Retrofit 与rxjava的结合使用起来方便,不用切换线程 所以带上rxjava的依赖一起添加
implementation 'com.squareup.okhttp3:okhttp:3.10.0' //okhttp
implementation 'com.squareup.retrofit2:retrofit:2.4.0' //retrofit
implementation 'com.squareup.retrofit2:converter-gson:2.3.0' //把 网络数据 通过gson 变为 对象
//rxjava
implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'com.amitshekhar.android:rx2-android-networking:1.0.0'
权限: <uses-permission android:name="android.permission.INTERNET"/>
2.使用说明首先要创建一个接口
imageget请求无参
public interface IFoodService{
@GET("wxnew/?key=52b7ec3471ac3bec6846577e79f20e4c&num=10&page=10.com")
Observable<ResponseBody> getCall();
}
##
get中分页加载和fragment复用不同请求数据一起使用(千万要注意path的只能在Query的前面是一个"坑")
//https://www.wanandroid.com/
@GET("project/list/{page}/json?")
Observable<TiXi_TiaoMu> getNeiCall(@Path("page")String page,@Query("cid")String cid);
get有参数的
@GET("/ios/cf/dish_list.php?stage_id=1&limit=20")
Call<ResponseBody> getFoodList(@Query("page") String page);
get有参以Map形式
@GET("/ios/cf/dish_list.php?stage_id=1&limit=20")
Call<ResponseBody> getFoodList(@Query("page") String page);
Call<ResponseBody> getFoodList(@QueryMap Map<String, String> options);
get有变量
public interface IFoodService {
//get请求且有变量是使用
@GET("20/{page}")
Call<ResponseBody> pathData(@Path("page") String a);
}
get拼接url使用
public interface IFoodService {
//拼接url使用
@GET()
Call<ResponseBody> urlData(@Url String url);
}
posh的请求
@FormUrlEncoded //表单请求
@POST("v1/login")
Call<ResponseBody> userLogin(@Field("phone") String phone, @Field("password") String password);
或者
@FormUrlEncoded
@POST("book/reviews")
Call<String> addReviews(@FieldMap Map<String, String> fields);
Url
使用base url和端点url可以应对大多数API,但是应用中总会出现另类的API。在我的示例中,现在要获取天气,当然我只能找到一个免费的api了。
@Headers("apikey:b86c2269fe6588bbe3b41924bb2f2da2")
@GET
Call<WeatherWrapper> weather(@Url String url, @Query("cityname") String cityName);
3.接口的注释就已经确定好请求代码的方式,而剩下的代码一样(一般使用的是Retrofit 与rxjava的结合使用起来方便,不用切换线程)
Retrofit build = new Retrofit.Builder()
.baseUrl("http://api.tianapi.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
IFoodService iFoodService = build.create(IFoodService.class);
Observable<ResponseBody> call = iFoodService.getCall();
call.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
try {
String string = responseBody.string();
Log.e("zll", "onNext: "+string );
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
4.上传文件
1.权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
2.需要进入手机内存所以要加动态获取权限
/**
* 动态获取权限,Android 6.0 新特性,一些保护权限,除了要在AndroidManifest中声明权限,还要使用如下代码动态获取
*/
if (Build.VERSION.SDK_INT >= 23) {
int REQUEST_CODE_CONTACT = 101;
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
//验证是否许可权限
for (String str : permissions) {
if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
//申请权限
this.requestPermissions(permissions, REQUEST_CODE_CONTACT);
return;
}
}
}
1.接口
public interface IFoodService{
/**
*
* @param requestBody 上传参数 post
* @param multipartBody 上传多媒体文件 file
* @return
*/
@Multipart
@POST("study/public/file_upload.php")
Call<ResponseBody> getCall(@Part("key")RequestBody requestBody,
@Part MultipartBody.Part multipartBody
);
}
2.方法
private void initData() {
// 1.获取文件
String filePath = Environment.getExternalStorageDirectory() + File.separator + "aa.jpg";
File file = new File(filePath);
if (file.exists()) {
Log.d("zll", "exists: " + true);
}
// 2 文件类型请求对象类型
RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpg"),file);
// 3.文件上传 多媒体对象
MultipartBody.Part multipartBody = MultipartBody.Part.createFormData("file",file.getName(),requestBody);
// 4. post普通参数 key (文件夹的名字) img
RequestBody postParams =RequestBody.create(MediaType.parse("text/plain"), "img");
Retrofit build = new Retrofit.Builder()
.baseUrl("http://yun918.cn/")
.addConverterFactory(GsonConverterFactory.create())
.build();
IFoodService iFoodService = build.create(IFoodService.class);
Call<ResponseBody> call = iFoodService.getCall(postParams, multipartBody);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
String string = response.body().string();
tv.setText(string);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
image
retrofit的poth以字符串形式请求
private void post() {
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("channelId", "b9240eee3b0211e8b64c00163e30445d");
jsonObject.put("cursor", "0");
} catch (JSONException e) {
e.printStackTrace();
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiService.mBaseUrl4)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
ApiService apiService = retrofit.create(ApiService.class);
RequestBody body = RequestBody.create(
MediaType.parse("application/octet-stream"), jsonObject.toString());
Observable<ResponseBody> news = apiService.postNews(body);
news.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
try {
Log.d(TAG, "onNext: " + responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: " + e.toString());
}
@Override
public void onComplete() {
}
});
}
public interface ApiService {
String mBaseUrl4 = "https://www.firstgainfo.com/firstga/app/";
@POST("news/upListNews")
@Headers("Content-Type:application/json")
Observable<ResponseBody> postNews(@Body RequestBody requestBody);
}