Retrofit 的使用详解(下载 多文件上传)

demo地址:

https://github.com/luhaoaimama1/ZoneStudio/blob/master/Android_Zone_Test/src/com/example/mylib_test/activity/http/retrofit/MyRetrofitTest.java

Retrofit提供了5种内置的注解:GET、POST、PUT、DELETE和HEAD,在注解中指定的资源的相对URL

url与参数小总结

@GET("users/list")  

也可以在URL中指定查询参数

@GET("users/list?sort=desc") 

请求的URL可以在函数中使用替换块和参数进行动态更新,替换块是{ and }包围的字母数字组成的字符串,相应的参数必须使用相同的字符串被@Path进行注释

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);  

准备工作:

Retrofit初始化

    public static ZoneApiInterface getClient(){
        Retrofit retrofit2 = new Retrofit.Builder()
                .baseUrl(Constant.ADDRESS_RetrofitClient)
                .addConverterFactory(GsonConverterFactory.create())
//                .client(ok.getClient())
                .build();
        return retrofit2.create(ZoneApiInterface.class);
    }

API接口

 public interface ZoneApiInterface {...}

callback回调

    static Callback callback =new Callback<Data>() {
        @Override
        public void onResponse(Call<Data> call, Response<Data> response) {
            System.out.println("url:"+  call.request().url()+"\t --->"+new Gson().toJson(response.body())+"\n\n");
        }
        @Override
        public void onFailure(Call<Data> call, Throwable t) {
            t.printStackTrace();
        }
    };

get请求

@Query

查询参数既 url?后边的

@GET("{user}")
 Call<Data> getZone(@Path("user") String user, @Query("name") String str);
getClient().getZone("log","Zone").enqueue(callback);

@QueryMap

 @GET("{user}")
Call<Data> getZone(@Path("user") String user, @QueryMap Map<String,String> map);
retrofit2.Call<Data> call2 =  getClient().getZone("log", map);//返回的时候call 可以灵活运用

@Url

在Retrofit 2.0添加了一个新的注解:@Url,它允许我们直接传入一个请求的URL。这样以来我们可以将上一个请求的获得的url直接传入进来。方便了我们的操作。

@GET

Call<Data> getZoneUrl(@Url String str);
getClient().getZoneUrl("http://101.40.6.224:8089/Test/log"+"?a=1").enqueue(callback);

这个会无视

POST

@Body

可以通过@Body注解指定一个对象作为Http请求的请求体

@POST("users/new")
Call<User> createUser(@Body User user);  

@Body map的时候

@POST(“{user}”)

 Call<Data> postZone(@Path("user") String user, @Body Map<String,String> map);
  getClient().postZone("log", map).enqueue(callback);

upLoad

1.最标准的

@POST(“log”)

 Call<Data> postZoneFile( @Body MultipartBody mb);//upload最为标准的

File file = new File("D:\\psb.jpg");
File file2 = new File("D:\\mei.jpg");
        //多个文件上传(已此为标准)  文件的时候item.isFormField()=false
        MultipartBody.Builder form = new MultipartBody.Builder();
        form.setType(MultipartBody.FORM);
        form.addFormDataPart("keyName","Zone");
        form.addFormDataPart("file","gaga.jpg", RequestBody.create(MediaType.parse("image/*"), file1));
        form.addFormDataPart("file2","meinv.jpg", RequestBody.create(MediaType.parse("image/*"), file));
        getClient().postZoneFile(form.build()).enqueue(callback);

2.Multipart官方的不太靠谱的 和上边仅仅是服务器的标志 不一样 item.isFormField()=true

       @Multipart
        @POST("log")
        Call<Data> sendFile(@Part(value = "myFile",encoding = "utf-8") RequestBody file);//upload
        @Multipart
        @POST ("log")
        Call<Data> sendFiles (@PartMap Map<String, RequestBody> params);
      //另一种方式 不太靠谱的 和上边仅仅是服务器的标志 不一样 item.isFormField()=true
        HashMap<String, RequestBody> mapFile = new HashMap<>();
        mapFile.put("keyName", RequestBody.create(MediaType.parse("text/x-markdown; charset=utf-8"),"Zone"));
        mapFile.put("file1",RequestBody.create(MediaType.parse("image/*"), file));
        getClient().sendFiles(mapFile).enqueue(callback);
//        _-------------单文件上传 和第二一样不标准-------------------
        getClient().sendFile(RequestBody.create(MediaType.parse("image/*"), file)).enqueue(callback);

download

 @GET
@Streaming
public Call<ResponseBody> down(@Url String url);//downLoad
static String downUrl = "http://down.360safe.com/360/inst.exe";
        //好使
        getClient().down(downUrl).enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                File file = new File("D:\\");
                if (file.exists()) {
                    System.out.println("you ");
                } else {
                    System.out.println("没有");
                }
                try {
                    System.out.println(response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });

Form encoded

我们可以使用@FormUrlEncoded注解来发送表单数据。使用 @Field注解和参数来指定每个表单项的Key,value为参数的值。

当我们有很多个表单参数时可以通过@FieldMap注解和Map对象参数来指定每个表单项的Key,value的值。

//@Field 这个应该和@body一样什么也能上传文件吧没尝试

        @FormUrlEncoded
        @POST("log")
        Call<Data> formUrlEncoded(@Field("name") String name, @Field("password") String password);
        @FormUrlEncoded
        @POST("log")
        Call<Data> formUrlEncodedFile(@FieldMap Map<String, String> map);
   private static void formUrlEncoded(Map<String, String> map) {
        getClient().formUrlEncoded("ZoneForm", "123456").enqueue(callback);
        getClient().formUrlEncodedFile(map).enqueue(callback);
    }
时间: 2024-10-03 23:05:50

Retrofit 的使用详解(下载 多文件上传)的相关文章

Struts2之命名空间详解及JSP文件上传了解

学习案例:struts配置元素详解以及简单的jsp文件上传. 一.案例分析: a)将鼠标放在struts.xml中的package标签上.Alt+/会自动提示: 1.name 2.namespace 3.extends 4.externalReferenceResolver 5.abstract 6.strict-method-invocation b)abstract属性表示该包是抽象的,不能直接使用,需要有子包继承才能使用.Struts-default既是abstract,所以我们要继承使用

详解jQuery uploadify文件上传插件的使用方法

uploadify这个插件是基于js里面的jquery库写的.结合了ajax和flash,实现了这个多线程上传的功能. 现在最新版为3.2.1. 在线实例 实例中用到的php文件UploaderDemo.php请在页面下方下载 引入文件 <link rel="stylesheet" type="text/css" href="uploadify.css" /> <script type="text/javascript

Java下载https文件上传到阿里云oss服务

今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 实现自己的证书信任管理器类 /** * @author mazhq * @Title: X509TrustUtiil * @ProjectName: zeus * @Description: 证书信任管理器类 * @date 2019/2/18 15:14 */ public class X509TrustUtil implements X509TrustManager { @Overr

文件上传下载之文件上传

13.1  文件上传 13.1.1  概述 在开发基于Web的应用的时候,经常会碰到需要实现文件上传.下载的功能,比如编辑某个商品,需要给它上传一个图片等等. 不使用Struts2的话,可以有很多种方式来实现文件上传,比如使用Apache的Common-FileUpload等.但是这些传统的方式,实现起来非常麻烦,需要写很多代码来进行控制. 现在使用Struts2来实现文件上传的功能,会更加简单和方便,事实上,Struts2的文件上传功能,默认就是基于Common-FileUpload来实现的,

SpringMVC简单入门 源码jar包下载和文件上传

1.Spring MVC简介 该项目的源码下载,springMVC和spring的jar包,请到 manyjar.com 下载. 下载方式1:点击下载 下载方式2:百度搜索manyjar(manyjar官网), 搜索springMVCUnit进行下载 Spring MVC基于java实现WEB MVC设计模式的的请求驱动类型的轻量级Web框架,将web层进行职责解耦,简化web开发. SpringMVC框架通过实现Model-View-Controller模式来将数据.业务与展现进行分离. Sp

JavaWeb中的文件上传和下载功能的内容就这么多

一.开发环境搭建 创建一个FileUploadAndDownLoad项目,加入Apache的commons-fileupload文件上传组件的相关Jar包,如下图所示: 二.实现文件上传 2.1.文件上传页面和消息提示页面 upload.jsp页面的代码如下: 1<%@ page language="java" pageEncoding="UTF-8"%> 2<!DOCTYPE HTML> 3<html> 4<head>

文件上传和下载--详解实现

 1.文件上传和下载分析 文件上传: 就是将客户端的数据发送到服务器上 文件上传要求:            浏览器端要求:                                    1.表单提交方式 post                                    2.提供文件上传框(组件) input type="file"                                    3.表单entype属性必须为 multipart/form-

Nancy之文件上传与下载

零.前言 由于前段时间一直在找工作,找到工作后又比较忙,又加班又通宵的赶项目,所以博客有段时间没有更新了. 今天稍微空闲一点,碰巧前几天看到有园友问我Nancy中下载文件的问题,然后就趁着休息的时间写下了这篇博客. 直接进正题吧! 一.新建一个空的asp.net应用程序 通过nuget安装相应的packages 二.添加Modules和Views文件夹 用于存放我们的“控制器”和视图(这一步不是必须的喔!) 三.新建CustomRootPathProvider.cs 具体如下: 1 public

salesforce 零基础学习(四十二)简单文件上传下载

项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文件上传到Document对象中. 一.文件上传功能 apex代码 1 public with sharing class FileUploadUsedTransientController { 2 3 public transient Blob fileUploadBody{get;set;} 4