【发布时间】:2020-07-01 18:18:28
【问题描述】:
我想为旧代码编写一个休息客户端,据我所知它接受多部分。 我的客户端是用 quarkus 编写的,并使用 resteasy-multipart-provider 我有旧代码要调用:
@POST
@Path("/upload")
@Produces(MediaType.APPLICATION_JSON)
public Response addFiles(@Context HttpServletRequest request, @Context ServletContext context)
{
try
{
File repository = (File) context.getAttribute("javax.servlet.context.tempdir");
DiskFileItemFactory factory = Utils.getDiskFileItemFactory(context, repository);
factory.setRepository(repository);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
List<FileItem> items = upload.parseRequest(request);
for (FileItem item: items)
{
if (!item.isFormField())
{
....
}
}
.....
}
还有我的客户:
@Path("/upload")
@RegisterRestClient(configKey = "scannedimage")
@ClientHeaderParam(name = "Authorization", value = "{lookupAuth}")
public interface UploadClient extends BearerAuthorizedHeader {
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
Response upload(@MultipartForm UploadBody data);
}
public class UploadBody {
@FormParam("objectId")
@PartType(MediaType.TEXT_PLAIN)
public Long long1;
@FormParam("entityId")
@PartType(MediaType.TEXT_PLAIN)
public Long long2;
@FormParam("doctype")
@PartType(MediaType.TEXT_PLAIN)
public Long documentType;
@FormParam("file")
@PartFilename("{file.getName}")
@PartType(MediaType.APPLICATION_OCTET_STREAM)
public File file;
}
响应总是返回空列表
{
"lon1": 1,
"long2": 2,
"list": [],
"error": ""
}
我做错了什么
我有一个使用 org.apache.httpcomponents:httpmime 创建的有效请求示例
HttpEntity entity = MultipartEntityBuilder.create().addTextBody("long1", "1").addTextBody("long2", "2499").addTextBody("doctype", "3306").addBinaryBody("file", file, ContentType.create("application/octet-stream"), "test.pdf").build();
HttpPost httpPost = new HttpPost("http://serviece/upload");
httpPost.setEntity(entity);
httpPost.setHeader("Authorization", "Bearer token");
HttpResponse response = httpClient.execute(httpPost);
HttpEntity result = response.getEntity();
System.out.println(EntityUtils.toString(result));
但如果可能的话,我想用 rest-client 来实现它
【问题讨论】:
-
你能发布一个完整的工作示例吗?目前尚不清楚您的响应字段应映射到什么。
-
@MichaelBerry 服务将文件保存在服务器目录中,并使用路径数据库创建行。 "list":[{"saveFileId":60464773,"nameOfFile":"test.pdf","docType":2}] 需要进一步的工作来获取 saveFileId。我不知道如何使用 microprofile rest-client 生成正确的请求
-
@MichaelBerry 但这是非常好的工作 HttpEntity entity = MultipartEntityBuilder.create().addTextBody("long1", "1").addTextBody("long2", "2499").addTextBody(" doctype", "3306").addBinaryBody("file", file, ContentType.create("application/octet-stream"), "test.pdf").build(); HttpPost httpPost = new HttpPost("serviece/upload"); httpPost.setEntity(entity); httpPost.setHeader("Authorization", "Bearer token"); HttpResponse response = httpClient.execute(httpPost); HttpEntity result = response.getEntity( );
标签: java multipart rest-client quarkus microprofile