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

如何使用Registfit 2将文件和其他参数一起发送

笪俊迈
2023-03-14

我正在寻找一个例子,我如何可以发送文件和其他params一起到服务器。

{
    "title": "title",
    "file": "uploaded file instance",
    "location": {
        "lat": 48.8583,
        "lng": 2.29232,
        "place": "Eiffel Tower"
    }
}

共有1个答案

史默
2023-03-14

使用GSON并为该位置创建一个模型类。

将以下依赖项添加到构建中。gradle

compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.google.code.gson:gson:2.5'

创建一个模型来表示位置。

public class Location {

    double lat;
    double lng;
    String location;

    public Location(double lat, double lon, String place) {
        this.lat = lat;
        this.lon = long;
        this.place = place;
    } 

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

public class Location {

    @SerializedName("lat")
    double latitude;
    @SerializedName("lng")
    double longitude;
    @SerializedName("place")
    String location;

    public Location(double lat, double lon, String place) {
        latitude = lat;
        longitude = long;
        location = place;
    } 

}
public interface Api {

    @POST("upload/")
    @Multipart
    Call<ResponseBody> uploadFile(@Part("title") RequestBody title,
                                  @Part MultipartBody.Part imageFile,
                                  @Part("location") Location location
    );

}
File file;
// create retrofit instance
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://baseurl.com/api/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
// create api instance
Api api = retrofit.create(Api.class);
// create call object
Call<ResponseBody> uploadFileCall = api.uploadFile(
        RequestBody.create(MediaType.parse("text/plain"), "title"),
        MultipartBody.Part.createFormData(
            "file",
            file.getName(),
            RequestBody.create(MediaType.parse("image"), file)),
        new Location(48.8583, 2.29232, "Eiffel Tower"));
// sync call
try {
    ResponseBody responseBody = uploadFileCall.execute().body();
} catch (IOException e) {
    e.printStackTrace();
}
// async call
uploadFileCall.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        if (response.isSuccessful()) {
            // TODO
        }
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        // TODO
    }
});

您可以类似地创建自定义响应类型对象,并用它替换responsebody,以接收反序列化的结果对象。

如果这管用就告诉我。显然,我没有机会在您的确切场景中进行测试,但我相当有信心这应该是可行的。我唯一不完全理解的部分是@part(“Location”)Location Location是否应该是@body(“Location”)Location Location

 类似资料:
  • 我想将ListView与其他小部件一起使用,但我不能。当我将容器用于ListView时,我不能查看任何其他小部件。我该怎么做?

  • 问题内容: 我正在使用jQuery将文件上传到服务器: 我想将其他参数与文件一起发送。可能吗?如果是,怎么办? 谢谢! 问题答案: 要发送其他参数,您可以将其附加到如下所示:

  • 问题内容: 我有一个应该重定向到项目视图页面的Ajax侦听器。但是,由于我使用泛型类型作为模型,因此我想在我的通用数据表控制器中另外指定带有第二个参数的视图。 不幸的是,一个可以在两种侦听器方法之间进行选择,一种可以使用 事件 参数来帮助识别对象,第二种可以让您有机会发送 免费的参数, 但是缺少事件。 模板 : 控制器 : 我可以向bean添加其他属性,但由于它是通用的,因此提供模型项不适合污染它

  • 问题内容: 我正在尝试在URL中传递路径参数和查询参数,但出现一个奇怪的错误。下面是代码 我的网址正在变成 我应该怎么做才能使其正常工作。我期望参数可以将id添加到网址中 请提出建议。提前致谢 问题答案: 我将使用from 来传递所有类型的URI参数。 例如:

  • 问题内容: 现在,我的问题是尝试在编辑该行时发送该行的ID()。 例如,我有一个带有列userid(),username(),firstname(),lastname()的网格。在编辑行时,网格仅发送参数用户名,名字和姓氏。在服务器端,我需要用户ID知道我已将哪些新值应用于这些用户。 editUrl看起来像: 谢谢 这是完整的代码: 问题答案: 您可以使用 (ID)列的定义中。该参数当前不是真正需

  • 我的代码是: 这给出了错误,请帮助…