- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的界面是这样的
@Multipart
@NonNull
@FormUrlEncoded
@POST("upload")
Call<GeneralResponse> uploadImage(@Header("Authorization") MultipartBody.Part token, @Part("image") MultipartBody.Part image, @Part("kilometer") MultipartBody.Part distance);
上传图片和数据的方法
public void upload(final String token,final String distance, final File image) {
InternetConnection internetConnection = new InternetConnection(TimeCard.this);
if (internetConnection.isConnectingToInternet()) {
showProgressDialog();
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
MultipartBody.Part bodykm;
RequestBody kilometer;
kilometer= RequestBody.create(MediaType.parse("text/plain"), distance);
bodykm =MultipartBody.Part.createFormData("kilometer", distance, kilometer);
Call<GeneralResponse> call = apiService.uploadImage(token,bodyImage,bodykm);
call.enqueue(new Callback<GeneralResponse>() {
@Override
public void onResponse(Call<GeneralResponse> call, final Response<GeneralResponse> response) {
try {
if(response.body().getStatus()){
meterImage = "";
distanceKm = "";
Toast.makeText(TimeCard.this,response.body().getMessage(),Toast.LENGTH_LONG).show();
}else {
Toast.makeText(TimeCard.this,response.body().getMessage(),Toast.LENGTH_LONG).show();
}
}catch (Exception e){
progressDialog.dismiss();
e.printStackTrace();
Toast.makeText(TimeCard.this,e.getMessage(),Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<GeneralResponse> call, Throwable t) {
progressDialog.dismiss();
Toast.makeText(TimeCard.this,"Server error please try again later",Toast.LENGTH_LONG).show();
}
});
} else {
Toast.makeText(TimeCard.this,"Please check your internet connection",Toast.LENGTH_LONG).show();
}
}
它给出错误,因为只允许一种类型的注释。所以我将@Header 更改为@Part
@Multipart
@NonNull
@FormUrlEncoded
@POST("upload")
Call<GeneralResponse> uploadImage(@Part("Authorization") MultipartBody.Part token, @Part("image") MultipartBody.Part image, @Part("kilometer") MultipartBody.Part distance);
现在如何传递 header ? (如何将header转换为MultipartBody.Part?)
最佳答案
我先回答你的问题
it gives error because only one type of annotation is allowed
是的,这是 Retrofit 的预期行为。您不能一次使用多个注释。因此,只需从 uploadImage()
方法中删除 @FormUrlEncoded
注释即可。
现在,您想要将 distance 与图像一起发布。为此,您应该在 uploadImage()
方法(在服务类中)中使用如下所示。
@Part("kilometer") RequestBody distance // note: use RequestBody instead of MultipartBody.Part
并在 upload()
函数(在您的 Activity 中)中进行更改。
RequestBody kilometer = RequestBody.create(MediaType.parse("text/plain"), distance);
现在进入问题
how can I pass header using @Part in retrofit?
我假设您拥有动态授权 key (通过查看相关示例代码)。
如果您在运行时将动态授权 key 设置为 header ,则可以使用 Retrofit 的 @HeaderMap
注释。
只需在 uploadImage()
方法中进行以下更改即可。
@HeaderMap Map<String, String> token
在 Activity 内部准备如下所示的标题映射。
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", token);
如果要设置其他 header 参数,请将其设置在相同的 header HashMap 中。
然后将此 header 映射传递给您的 uploadImage()
方法。
因此,您的代码中的最终更改如下所示。
您的服务界面
@Multipart
@NonNull
@POST("upload")
Call<GeneralResponse> uploadImage(@HeaderMap Map<String, String> token, @Part("image") MultipartBody.Part image, @Part("kilometer") RequestBody distance);
在 Activity 中
public void upload(final String token,final String distance, final File image) {
InternetConnection internetConnection = new InternetConnection(TimeCard.this);
if (internetConnection.isConnectingToInternet()) {
showProgressDialog();
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
// prepare distance body
RequestBody kilometer = RequestBody.create(MediaType.parse("text/plain"), distance);
// prepare headers
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", token);
Call<GeneralResponse> call = apiService.uploadImage(headers, bodyImage, kilometer);
call.enqueue(new Callback<GeneralResponse>() {
@Override
public void onResponse(Call<GeneralResponse> call, final Response<GeneralResponse> response) {
try {
if(response.body().getStatus()){
meterImage = "";
distanceKm = "";
Toast.makeText(TimeCard.this,response.body().getMessage(),Toast.LENGTH_LONG).show();
}else {
Toast.makeText(TimeCard.this,response.body().getMessage(),Toast.LENGTH_LONG).show();
}
}catch (Exception e){
progressDialog.dismiss();
e.printStackTrace();
Toast.makeText(TimeCard.this,e.getMessage(),Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<GeneralResponse> call, Throwable t) {
progressDialog.dismiss();
Toast.makeText(TimeCard.this,"Server error please try again later",Toast.LENGTH_LONG).show();
}
});
} else {
Toast.makeText(TimeCard.this,"Please check your internet connection",Toast.LENGTH_LONG).show();
}
}
额外
如果您有静态 token (从不根据用户或 API key 更改的 token ),则无需在此处使用 header 映射模式。只需跳过 @HeaderMap
注释/参数。进行如下更改。
@Headers("Authorization: your_token_key_here")
@Multipart
@NonNull
@POST("upload")
Call<GeneralResponse> uploadImage(@Part("image") MultipartBody.Part image, @Part("kilometer") RequestBody distance);
同样,如果您有多个 header ,请将 header 参数括在 {}
大括号内。
@Headers({
"Authorization: your_token_key_here",
"Content-Type: application/json", // just an example
"some other header here"
})
@Multipart
@NonNull
@POST("upload")
Call<GeneralResponse> uploadImage(@Part("image") MultipartBody.Part image, @Part("kilometer") RequestBody distance);
关于android - 如何在改造中使用@Part 传递 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51731380/
这确实是一个分开的用法问题,但欢迎提出有关如何实现此目的的其他想法。 我需要创建一个引导设备,设置如下: ( up to 4MB erase block size (EBS)): partitions
我想知道定义库及其内容的方式背后的原因是什么。更具体地说,库需要列出所有部分,并且这些部分需要说明它们所属的库。 这种双向对我来说似乎是不必要的,我希望从库中引用这些部件就足够了。此外,在库中添加或删
我对 lambda 表达式比较陌生,如果有人能解释为什么返回类型与我预期的不同,我会很高兴。 () -> MultipartBody.Part! 究竟是什么? Single.just{ val
我对 map reduce 输出部分文件有一些疑问。 1> part-r-*文件和map reduce输出的part-*文件有什么区别? part-r-* 是 mapper 的输出,part-* 是
我需要为移动应用程序创建 Rails API。 API 将发送和接收 json 格式的请求。 我还想创建一个后端来管理应用程序。后端将在桌面(管理员)上使用带有用户界面的 Rails。 我想知道是否有
我正在使用此功能发布多张图片 @Multipart @POST("addad") Call addad( @Part List files , @Part Multip
我有一个正在为项目开发的小型 Java 程序,它使用 JavaMail 从指定的 URI 中提取用户的收件箱,然后开始处理消息。 在 Outlook 中,属性菜单中有一个功能可以设置邮件的到期日期,它
我不完全理解 part 之间的区别/part of和 import/export在 Dart 中使用库时。例如: one.dart: library one; part "two.dart"; Cla
这个问题在这里已经有了答案: How can I upload files to a server using JSP/Servlet? (14 个答案) 关闭 6 年前。 我正在尝试通过 JSP
我想使用 spark 从 html 表单上传文件。以下是我处理发布路由的 java 函数: Spark.post("/upload", "multipart/form-data", (request,
对于我的 python 扩展,我有 C(来自嵌入式库)和 C++ 文件,它们被编译并链接在一起。只有 C++ 部分与 Python 接口(interface)(通过 SWIG)。这在 VS2015 的
我想使用子例程 sum_real 访问数组派生类型中数组的元素。即:对所有人的权重中的第一个条目求和。 type my_type real, dimension(:), allocatable
最近我将 sonarqube 从 4.0 升级到 4.3.3。升级后当我尝试运行 maven 构建时出现错误: Failed to execute goal org.codehaus.mojo:son
我拿了一个 wsp 文件,并像往常一样做了我的 stsadm -o addsolution。然后我进入中央管理->解决方案管理,结果一切正常。然后我部署了 Web 部件,到目前为止没有问题。 问题是当
在我的 Eclipse 插件中我有这个工作流: 在Package Explorer中获取当前选中的项目 做某事 在Package Explorer中获取当前选中的项目(同1) 做一些不同的事情 1(和
我正在尝试使用 Spring MVC 和 Thymeleaf 上传文件,但出现异常,提示未提供多部分配置。 这是我的 Thymeleaf 表格: Picture
我知道 map reduce 输出存储在名为 part-r-* for reducer 和 part-m-* for mapper 的文件中。 当我运行 mapreduce 作业时,有时会在单个文件中
我们在运行 CentOS 的 Virtual Box 上使用 Hadoop 的同时处理 BigData。每当我们执行某些程序时,它都会创建 2 个不同的文件 1) part-r-00000 和 2)
我在其他论坛上看到过有关此问题的相关帖子(请参阅: http://www.mrexcel.com/forum/showthread.php?t=372534 ),但我尝试了所有发现的方法,但没有成功。
我无法将图像上传到服务器。我在这里尝试了很多相关问题的解决方案,但没有一个对我有用。这是我的文件: SecurityApplicationInitializer: package co
我是一名优秀的程序员,十分优秀!