android - 是否可以在 retrofit2 中发送带有 multipart 的 @Fields?
问题描述
我正在使用retrofit2,我使用@FormUrlEncoded 通过它发送数据,因为一切都是字符串,甚至图像,但是当我将图像集合作为字符串发送时我遇到了一些错误,所以我更改为多部分。
现在我面临的问题是我无法使用多部分发送字符串的@Field。
那么,如何在不对每个字符串都使用 RequestBody 的情况下解决这个问题呢?
这是我的代码
@Multipart
@POST("/androidfiles/insertNews.php")
Call<ResponseBody> uploadImage(@Part MultipartBody.Part file, @Part("name") RequestBody name,
@Field("tArabic") String arabicTitle,
@Field("tEnglish") String englishTitle,
@Field("tRussian") String russianTitle,
@Field("tItalian") String italianTitle,
@Field("dArabic") String arabicDescription,
@Field("dEnglish") String englishDescription,
@Field("dRussian") String russianDescription,
@Field("dItalian") String italianDescription);
和这里。
private void insertNews(Uri uri){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ServiceConstants.URL)
.build();
File file = FileUtil.getFile(this, uri);
RequestBody mFile = RequestBody.create(MediaType.parse("image/*"), file);
MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), mFile);
RequestBody filename = RequestBody.create(MediaType.parse("text/plain"), file.getName());
ApiConfig apiConfig = retrofit.create(ApiConfig.class);
Call<ResponseBody> addNews = apiConfig.uploadImage(fileToUpload,
filename,
etArabicTitle.getText().toString(),
etEnglishTitle.getText().toString(),
etRussianTitle.getText().toString(),
etItalianTitle.getText().toString(),
etArabicDescription.getText().toString(),
etEnglishDescription.getText().toString(),
etRussianDescription.getText().toString(),
etItalianDescription.getText().toString());
addNews.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Toast.makeText(News.this, "success" + "\n" + response.message(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(News.this,Menu.class);
startActivity(intent);
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(News.this, "fail" + t.getMessage(), Toast.LENGTH_SHORT).show();
t.printStackTrace();
}
});
}
解决方案
使用 Retrofit使用多部分请求@Part
时,您可以使用具有附加参数字段的注释传递额外RequestBody
参数。
因此,您可以将它作为RequestBody
类型传递给除多部分主体之外的所有参数,如下所示:
@Multipart
@POST("/androidfiles/insertNews.php")
Call<ResponseBody> uploadImage(@Part MultipartBody.Part file,
@Part("name") RequestBody name,
@Part("tArabic") RequestBody arabicTitle,
@Part("tEnglish") RequestBody englishTitle,
@Part("tRussian") RequestBody russianTitle,
@Part("tItalian") RequestBody italianTitle,
@Part("dArabic") RequestBody arabicDescription,
@Part("dEnglish") RequestBody englishDescription,
@Part("dRussian") RequestBody russianDescription,
@Part("dItalian") RequestBody italianDescription);
现在,调用这样的API;您需要通过使用语法创建RequestBody
附加参数作为MIME 类型来传递它 text/plain
(i.e. RequestBody.create(MediaType.parse("text/plain"), your variable goes here))
在 API 构建期间,您可以将其调用为:
Call<ResponseBody> addNews = apiConfig.uploadImage(fileToUpload,
filename,
RequestBody.create(MediaType.parse("text/plain"), etArabicTitle.getText().toString()), //This will make it as RequestBody to pass it along image/files.
RequestBody.create(MediaType.parse("text/plain"), etEnglishTitle.getText().toString()),
RequestBody.create(MediaType.parse("text/plain"), etRussianTitle.getText().toString()),
RequestBody.create(MediaType.parse("text/plain"), etItalianTitle.getText().toString()),
RequestBody.create(MediaType.parse("text/plain"), etArabicDescription.getText().toString()),
RequestBody.create(MediaType.parse("text/plain"), etEnglishDescription.getText().toString()),
RequestBody.create(MediaType.parse("text/plain"), etRussianDescription.getText().toString()),
RequestBody.create(MediaType.parse("text/plain"), etItalianDescription.getText().toString()));
推荐阅读
- c# - 使用 linq 在 EFcore 中展平 IEnumerable
- php - Laravel 发送自定义电子邮件
- python - Python - 根据列值获取百分比
- c# - asp.net core:有没有办法在管道中使用 app.Map() 将请求分支到根路径?
- javascript - Javascript:访问对象子属性的快捷方式(如果已定义)
- python - 如何定位图形
- ios - 表格视图滚动指示器和安全区域顶部边缘之间的小空间
- reactjs - Material Ui Table Row 悬停和选定的颜色变化
- mysql - mysql中父组的父组
- javascript - 这是写 document.write(x=4 + ++x); 的权利吗?