当前位置: 首页 > 知识库问答 >
问题:

Retrfoit:以@RequestBody和@Multipart的形式发送jsonObject

章承基
2023-03-14

我想将json对象发送到服务器,并将其改装为RequestBody

 {"attach": {
    "image": {
        "height": 1473,
        "urlRef": "",
        "width": 1473
    },
    "video": {
        "duration": "4.365",
        "height": 1920,
        "thumbUrl": "",
        "urlRef": "",
        "width": 1080
    }
}
}

这是我的改装对象

  Retrofit.Builder retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create());

这是我的改造界面:

@Multipart
@POST("post/")
Observable<Response> postAttach(
        @Part("attach") RequestBody asset
        , @Part MultipartBody.Part attachment
);

并创建RequestBody,如下所示:

RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), gson.toJson(myAttach));

但此请求将json作为字符串而不是json对象发送

那么我如何以jsonObejct的形式发送呢?

注意:如果我使用@Body作为json对象发送,但在中,我不能将@Body与@MultiPart一起使用!

共有1个答案

艾茂学
2023-03-14

回答这个问题有点晚了。我希望在这里发布答案会有所帮助。

正如你在问题中所说,

但此请求将json作为字符串而不是json对象发送

它接受以下(可能的)参数

  1. 创建(@Nullable MediaType contentType,字符串内容)
  2. 创建(@Nullable MediaType contentType,ByteString内容)
  3. 创建(@Nullable MediaType contentType, byte[]内容)
  4. 创建(@Nullable MediaType contentType,byte[]内容,int偏移量,int byteCount)
  5. 创建(@Nullable MediaType contentType, File file)

正如您所看到的,没有接受JSONObject的参数类型。您需要以字符串格式传递JSON。

您仍然可以使用Multipart上传发布JSON正文。

您需要进行以下更改。

在接口

@Multipart
@POST("post/")
Observable<Response> postAttach(
    @Part RequestBody asset,           // <==== just remove ("attach")
    @Part MultipartBody.Part attachment
);

创建以下POJO类。

图像类

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Image {

   @SerializedName("height")
   @Expose
   private int height;
   @SerializedName("urlRef")
   @Expose
   private String urlRef;
   @SerializedName("width")
   @Expose
   private int width;

   public Image(int height, String urlRef, int width) {
      this.height = height;
      this.urlRef = urlRef;
      this.width = width;
   }

   // other constructors, getter and setter methods
}

视频类

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Video {

   @SerializedName("duration")
   @Expose
   private String duration;
   @SerializedName("height")
   @Expose
   private int height;
   @SerializedName("thumbUrl")
   @Expose
   private String thumbUrl;
   @SerializedName("urlRef")
   @Expose
   private String urlRef;
   @SerializedName("width")
   @Expose
   private int width;

   public Video(String duration, int height, String thumbUrl, String urlRef, int width) {
      this.duration = duration;
      this.height = height;
      this.thumbUrl = thumbUrl;
      this.urlRef = urlRef;
      this.width = width;
   }

   // other constructors, getter and setter methods
}

附加类

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Attach {

   @SerializedName("image")
   @Expose
   private Image image;
   @SerializedName("video")
   @Expose
   private Video video;

   public Attach(Image image, Video video) {
      this.image = image;
      this.video = video;
   }

   // constructors, getter and setter methods
}

MyAttach类

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class MyAttach {

   @SerializedName("attach")
   @Expose
   private Attach attach;

   public MyAttach(Attach attach) {
      this.attach = attach;
   }

   // other constructors, getter and setter methods    
}

在代码中使用上述类。

Image image = new Image(1473, "image_url", 1473);
Video video = new Video(4.365, 1920, "thumb_url", "video_url", 1080);
Attach attach = new Attach(image, video);
MyAttach attach = new MyAttach(attach);

// finally serialize the above MyAttach object into JSONObject
Gson gson = new Gson();
String json = gson.toJson(attach);

并将此JSON数据传递到接口中。

RequestBody requestBody = RequestBody.create(
                         MediaType.parse("multipart/form-data"), // notice I'm using "multipart/form-data"
                         json
                         );

将其传递给接口

MultipartBody.Part attachment = // prepare file to upload
// other codes here
YourCustomResponseClassHere call = yourService.postAttach(requestBody, attachment);
call.enqueue({ /* your implementation */ });
 类似资料:
  • 我正在Spring-Boot中实现微服务。我尝试将@RequestBody与一个MultipartFile一起发送。我在stackoverflow中引用了一些问题,但没有任何帮助。 视频类 方法 我只是试着用@requestpart,并附上我如何请求的屏幕截图 错误为

  • 本文向大家介绍php以post形式发送xml的方法,包括了php以post形式发送xml的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php以post形式发送xml的方法。分享给大家供大家参考。具体方法如下: 方法一,使用curl: 方法二,使用fsockopen: PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用: 在线XML/JSON互相转换工具: http:/

  • 问题内容: 我如何发送VitalGroupID和Temperature作为整数而不是String…。这是在我点击Submit按钮后形成的请求。 问题答案: 严格来说,json是无类型的,因此您不能将其作为整数发送,它必须是字符串。javascript对象不太严格,因此您拥有的对象将评估为javascript对象,但没有严格的json解析器将能够理解它。 最好的办法是使用parseInt在客户端转换

  • 我正在使用最新版本的openapi-用户界面1.6.7,我无法使文件上传endpoint工作。这是我对参数的配置: 当我在生成的招摇过市UI中使用“试用”按钮时,会出现415个不支持的媒体类型错误。请求头的内容类型为: 我认为这就是错误的来源。从OpenApi生成的json如下所示: 我缺少什么来发送表单数据内容类型的正确请求?

  • 我想发送一个函数作为参数。当我在另一个函数中调用它“this”和其他类似“HttpClient”的函数时,“urlBase”是未定义的。 我在互联网上搜索并找到了关于bind()属性的信息,但如果现在定义了“this”,其他属性仍然没有定义。所以我把所有需要的属性都放在bind()函数中,但对我来说很糟糕。。。 这是我的服务功能,它确实工作得很好。 这是我想给它另一个函数作为参数的函数: 以及之前

  • 问题内容: 我在使用jQuery的ajax函数将文件发送到服务器端PHP脚本时遇到问题。可以获取File- List,但是如何将此数据发送到服务器呢?使用文件输入时,服务器端php脚本上的结果数组()为0()。 我知道这是可能的(尽管直到现在我还没有找到任何jQuery解决方案,只有Prototye代码(http://webreflection.blogspot.com/2009/03/safar