Aun*_*iha 5 android retrofit retrofit2
发布新产品时,我的服务器需要使用密钥捕获文件。多少个文件没有限制。文件是无限的。
使用Retrofit 1.9,一切都完美无缺。更新到Retrofit 2后,我的服务器未收到任何文件。
如果我编辑服务器,它将不再向后兼容。我需要使android应用能够像Retrofit 1.9一样工作。
这是我的实现方式。
类以创建ApiService接口。
public class ApiClient {
public interface ApiInterface {
@Multipart
@POST("/products/")
void uploadProduct(
@PartMap Map<String, String> params,
@PartMap Map<String, TypedFile> files,
Callback<Product> cb);
}
}
Run Code Online (Sandbox Code Playgroud)
使用ApiService。
Map<String, String> params = new HashMap<>();
params.put("title", title);
params.put("price", price);
params.put("content", content);
Map<String, TypedFile> files = new HashMap<>();
for (int pos = 0; pos < photoPaths.length; pos++) {
if (!Strings.isNullOrEmpty(photoPaths[pos])) {
TypedFile typedFile = new TypedFile("multipart/form-data", new File(photoPaths[pos]));
files.put("photo_" + String.valueOf(pos + 1), typedFile);
}
}
apiInterface.uploadProduct(params, files, cb);
Run Code Online (Sandbox Code Playgroud)
类以创建ApiService接口。
public class ApiClient {
public interface ApiInterface {
@Multipart
@POST("/products/")
Call<Product> uploadProduct(
@PartMap Map<String, RequestBody> params,
@PartMap Map<String, RequestBody> files);
}
public static final String MULTIPART_FORM_DATA = "multipart/form-data";
public static RequestBody createRequestBody(@NonNull File file) {
return RequestBody.create(
MediaType.parse(MULTIPART_FORM_DATA), file);
}
public static RequestBody createRequestBody(@NonNull String s) {
return RequestBody.create(
MediaType.parse(MULTIPART_FORM_DATA), s);
}
}
Run Code Online (Sandbox Code Playgroud)
使用ApiService
Map<String, RequestBody> params = new HashMap<>();
params.put("title", ApiClient.createRequestBody(title));
params.put("price", ApiClient.createRequestBody(price));
params.put("content", ApiClient.createRequestBody(content));
Map<String, RequestBody> files = new HashMap<>();
for (int pos = 0; pos < photoPaths.length; pos++) {
if (!TextUtils.isEmpty(photoPaths[pos])) {
RequestBody requestBody = ApiClient.createRequestBody(new File(photoPaths[pos]));
files.put("photo_" + String.valueOf(pos + 1), requestBody);
}
}
Call<Product> call = apiInterface.uploadProduct(params, files);
Run Code Online (Sandbox Code Playgroud)
我应用了这个解决方案,现在已经修复。
这是我的实施方式。
Map<String, RequestBody> params = new HashMap<>();
params.put("title", ApiClient.createRequestBody(title));
params.put("price", ApiClient.createRequestBody(price));
params.put("content", ApiClient.createRequestBody(content));
Map<String, RequestBody> files = new HashMap<>();
for (int pos = 0; pos < photoPaths.length; pos++) {
if (!TextUtils.isEmpty(photoPaths[pos])) {
RequestBody requestBody = ApiClient.createRequestBody(new File(photoPaths[pos]));
// fix is right here
String key = String.format("%1$s\"; filename=\"%1$s", "photo_" + String.valueOf(pos + 1));
files.put(key, requestBody);
}
}
Call<Product> call = apiInterface.uploadProduct(params, files);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6566 次 |
| 最近记录: |