添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
@FormUrlEncoded
@POST("upload")
Call<ResponseBody> uploadParams(@Field("username")String username,@Field("token")String token);

使用直接传入参数值即可

2. 多个参数上传

@FormUrlEncoded
@POST("upload")
Call<ResponseBody> uploadParams(@FieldMap Map<String,String> map);   

调用的时候,直接传入一个map集合,即可

3. 通用的方法

@POST("upload")
Call<ResponseBody> uploadParams(@Body RequestBody body);

调用时,传入一个RequestBody对象,OkHttp库中有一个专门用来构建参数上传的RequestBody子类,即FormBody,如下

FormBody body=new FormBody.Builder()
                .add("username","admin")
                .add("token","sjdkdjows=dmzkkshf")
                .build();

在使用的时候,直接调用uploadParams (body)即可实现上传。

1. 单个文件上传

 @Multipart
 @POST("upload")
Call<ResponseBody> uploadOneFile(@Part MultipartBody.Part body);

调用的使用MultipartBody.Part来构造一个Part对象参数

String name = etFileName.getText().toString().trim();
name = TextUtils.isEmpty(name) ? "1.png" : name;
String path = Environment.getExternalStorageDirectory() + File.separator + name;
File file = new File(path);
RequestBody fileRQ = RequestBody.create(MediaType.parse("image/*"), file);
MultipartBody.Part part MultipartBody.Part.createFormData("picture", file.getName(), fileRQ);
Call<ResponseBody> uploadCall = downloadService.uploadOneFile(part);

2. 多文件上传

使用@PartMap实现

@Multipart
@POST("upload")
Call<ResponseBody> uploadFiles(@PartMap Map<String, RequestBody> map);
RequestBody fb = RequestBody.create(MediaType.parse("text/plain"), "hello,retrofit");
RequestBody fileTwo = RequestBody.create(MediaType.parse("image/*"), new File(Environment.getExternalStorageDirectory()
                + file.separator + "original.png"));
Map<String, RequestBody> map = new HashMap<>();
//这里的key必须这么写,否则服务端无法识别
map.put("file\"; filename=\""+ file.getName(), fileRQ);
map.put("file\"; filename=\""+ "2.png", fileTwo);
Call<ResponseBody> uploadCall = downloadService.uploadFiles(map);

使用@Part实现

@Multipart
@POST("upload")
Call<ResponseBody> uploadFiles(@Part List<MultipartBody.Part> parts);

调用代码如下:

RequestBody fileRQ = RequestBody.create(MediaType.parse("image/*"), file);
MultipartBody.Part part = MultipartBody.Part.createFormData("picture", file.getName(), fileRQ);
RequestBody fb = RequestBody.create(MediaType.parse("text/plain"), "hello,retrofit");
RequestBody fileTwo = RequestBody.create(MediaType.parse("image/*"), new File(Environment.getExternalStorageDirectory()
                + file.separator + "original.png"));
MultipartBody.Part two=MultipartBody.Part.createFormData("one","one.png",fileTwo);
List<MultipartBody.Part> parts=new ArrayList<>();
parts.add(part);
parts.add(two);
 Call<ResponseBody> uploadCall = downloadService.uploadFiles(parts);

文件和参数混合上传

@Multipart
@POST("upload")
Call<ResponseBody> uploadFile(@Part("body") RequestBody body, @Part MultipartBody.Part file);
MultipartBody.Part part = MultipartBody.Part.createFormData("picture", file.getName(), fileRQ);
RequestBody fb =RequestBody.create(MediaType.parse("text/plain"), "hello,retrofit");
Call<ResponseBody> uploadCall = downloadService.uploadFile(fb,part);

通用上传方式

接口定义,注意这个时候没有@Multipart

 @POST("upload")
 Call<ResponseBody> uploadFile(@Body RequestBody body);

利用MultipartBody来实现通用的参数和文件上传

String name = etFileName.getText().toString().trim();
        name = TextUtils.isEmpty(name) ? "1.png" : name;
        String path = Environment.getExternalStorageDirectory() + File.separator + name;
        File file = new File(path);
        RequestBody fileRQ = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        MultipartBody.Part part = MultipartBody.Part.createFormData("picture", file.getName(), fileRQ);
        RequestBody body=new MultipartBody.Builder()
                .addFormDataPart("userName","lange")
                .addFormDataPart("token","dxjdkdjkj9203kdckje0")
                .addFormDataPart("header",file.getName(),fileRQ)
                .build();
        Call<ResponseBody> uploadCall = downloadService.uploadFile(body);
        uploadCall.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                Log.i("upload", response.isSuccessful() + "");
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {

看下服务端的输出:

userName-->lange
token-->dxjdkdjkj9203kdckje0
/Users/lange/Desktop/web/out/artifacts/web_war_exploded/upload/1.png
 

当我们采用这种方式上传的时候,不能再接口上加上@Multipart的注解,否者会报错

  1. 如果在上传文件的时候,定义:
 @Multipart
@POST("upload")
Call<ResponseBody> uploadOneFile(@Part RequestBody file);

显示下面的错误:

 @Part annotation must supply a name or use MultipartBody.Part parameter type. (parameter #1)
  1. 如果@Part加上参数,并RequestBody作为参数,上传文件,服务端识别不出来这是一个文件,会当做一个参数上传的例子
 @Multipart
@POST("upload")
Call<ResponseBody> uploadOneFile(@Part("file") RequestBody file);
  1. 如果使用MultipartBody.Part作为参数,又加上了名字
uploadOneFile(@Part("file") MultipartBody.Part file)

则会显示下面的错误

@Part parameters using the MultipartBody.Part must not include a part name in the annotation



作者:lange0x0
链接:https://www.jianshu.com/p/74b7da380855
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

参数上传1. 参数个数不是很多时@FormUrlEncoded@POST("upload")Call&lt;ResponseBody&gt; uploadParams(@Field("username")String username,@Field("token")String token);使用直接传入参数值即可2. 多个参数上传@FormUrlEncoded@P...
最近项目里用到了类似图文上传的功能,以前都是封装OkHttp的文件上传功能,这次想换个姿势,想用Retrofit2.0实现这样的功能,本来以为挺简单的,没想到进入了深坑,连续调整了好几种姿势都报了同一个错,接着网上类似的文章找了一大推,讲得都是模棱两可,或者对多参数格式不够友好,最后还是去看了相关的源码,自己把这个问题提出来解决了,在这里记录一下。 一、定义网络请求接口 public interface GoodsReturnApiService { @Multipart @POST(Compares.GOODS_RETURN_POST) //这里是自己post文件的地址 Android发展到现在,Okhttp显得越来越重要,所以,这次我选择用Okhttp上传图片。 Okhttp目前已经更新到Okhttp3版本了,用法跟之前相比,也有一些差别。在网上找了很多资料, 并和java后台同事反复调试,终于成功上传多张图片,同时传递一些键值对参数。 以下是我对该过程的封装: private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); * 上传
Retrofit2Samples Retrofit2 Samples 与 Nodejs 服务端接口 网络上对 Retrofit2 的各种介绍文章已经很多了,不过往往只是对其用法进行介绍,而缺少相应的实践,这一方面是因为网络上的免费API接口返回的数据格式和访问模式(一般都只能使用 Get 模式)有限制,另一方面是因为并不是每位开发者都会写服务端接口。这样就造成了在学习 Retrofit2 的过程中,对某些参数的作用并不能直观感受到,所以这里我就尝试着用 Nodejs 搭建了一个本地服务器,提供了几个接口用于支持 Get、Post 模式访问调用,支持文件上传文件下载功能,返回的数据格式有 Json 对象和 Json 数组,需要的参数格式可以由使用者来自由定义 本篇文章不会对 Retrofit2 的用法进行过多介绍,重点在于介绍服务端接口的搭建以及 Retrofit2 与服务端的交互 @RequestMapping("/filesUpload")     public void filesUpload(HttpServletRequest request, HttpServletResponse response,             @RequestParam MultipartFile image) throws IOException {...
@POST("xxxxx/images/") Flowable<UpImgAndTextBean> upLoadImgAndText( @Part("title") String title, @Multipart @POST("/xxxx/upload") Observable<UploadImgBean> upload(@Part() MultipartBody.Part file, @PartMap Map<String, RequestBody> map); @Part() MultipartBody.Part file上传单个文件,也可以上传多个 --@PartMap... String query = "SELECT parameter1, parameter2 FROM my_table WHERE id = ?"; PreparedStatement pstmt = connection.prepareStatement(query); pstmt.setInt(1, id); // 假设需要查询的是id为1的记录 ResultSet rs = pstmt.executeQuery(); if (rs.next()) { String parameter1 = rs.getString("parameter1"); int parameter2 = rs.getInt("parameter2"); // 这里可以将查询出来的参数上传到接口 接下来,你可以使用Retrofit上传参数到接口。假设接口是一个POST请求,上传参数是JSON格式的数据。可以使用Retrofit的注解来定义接口方法和参数。例如: public interface MyApi { @POST("my_endpoint") Call<MyResponse> uploadData(@Body MyData data); public class MyData { private String parameter1; private int parameter2; // getter和setter // 创建Retrofit实例 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://my.api.com/") .build(); // 创建API代理 MyApi api = retrofit.create(MyApi.class); // 构造请求参数 MyData data = new MyData(); data.setParameter1(parameter1); data.setParameter2(parameter2); // 发送请求 Call<MyResponse> call = api.uploadData(data); Response<MyResponse> response = call.execute(); 这样,就可以从数据库查询参数上传到接口了。注意,这里只是示例代码,具体实现需要根据实际情况进行调整。