我之前使用网络请求也都是用的Retrofit,但是基本上都只是简单的get和post请求,这是我前几天看网上有位哥们写的Retrofit上传多张图片的文章,我也跟着写了一下下,并顺便扩展了那么一丢丢。
类容简要
多文件上传添加头信息结合Rxjava使用 这里只提了一下 在之前的博客已经有叙述了。
Retrofit使用的注意点:
1.上传多张图片: 有一个Multipart的注解
(
1)写一个接口
interface UploadImage{
@Mutilpart//多文件的注解
@POST(
"/upload")//post提交的子路径
Call<ResultBean>uploadMutilpartImage(@Header(
"head1") String head1,@PartMap map<String,RequestBody> files)
}
(
2)写一个配置并返回Retrofit实例的类
class AppClient{
public static final String API_URL=
"http://192.168.1.100:8080/"
public static <S> S CreateImageDemo(Class classz){
Retrofit retrofit=new Retrofit
.Buildler()
.baseUrl(API_URL)
.client()//可以自定义okhttpClinet 在自定义的client中可以配置拦截器,也可以配置头信息
.addConverterFactory(GsonConverterFactory
.create())//Gson解析
//
.addCallAdapterFactory(RxJavaCallAdapterFactory
.create())//这是结合Rxjava联合使用时,返回一个Observerble对象
.build()
retrofit
.create(UploadImage
.class)
}
(
3)在需要的地方调用请求方法
HashMap<String, RequestBody> map = new HashMap<>()
UploadImageapi = (UploadImage) ApiClient
.CreateImageDemo(UploadImage
.class)
for (int i =
0
File file = new File(
"/111")
map
.put(
"file" + i +
"\"; filename=\"" + file
.getName(), RequestBody
.create(MediaType
.parse(imgList
.get(i)
.mimeType), file))
}
Call<ResultBean>encuall=api
.uploadMuitlpartImage(
"头信息1",map)
encuall
.enqueue(new Callback<ResultBean>() {
@Override
public void onResponse(
Call<ResultBean>
call, Response<ResultBean> response) {
ResultBean body = response
.body()
if (response
.isSuccessful() && response
.body()
.getCode()==
1) {
Toast
.makeText(MainActivity
.this,
"上传成功", Toast
.LENGTH_LONG)
.show()
} else {
Toast
.makeText(MainActivity
.this,
"上传失败-------", Toast
.LENGTH_LONG)
.show()
}
}
@Override
public void onFailure(
Call<ResultBean>
call, Throwable t) {
Log
.e(
"------->",t
.getMessage())
Toast
.makeText(MainActivity
.this,
"上传失败+++++++", Toast
.LENGTH_LONG)
.show()
}
})
当然这只是在使用时遇到的一点点小感触而已,我还有一个问题不太懂,就是@path和@Query的区别,我还没弄明白。。。