【问题标题】:how to read multipart entity from android in jersey web service如何在泽西 Web 服务中从 android 读取多部分实体
【发布时间】:2015-01-05 11:48:03
【问题描述】:

我正在从 android 客户端获取多部分实体,如下所示。

       HttpClient httpClient = new DefaultHttpClient();

        HttpPost postRequest = new HttpPost(
        "http://localhost:9090/MBC_WS/rest/network/mobileUserPictureInsert1");


        MultipartEntity reqEntity = new MultipartEntity(
                HttpMultipartMode.BROWSER_COMPATIBLE);
        reqEntity.addPart("message", new StringBody("hi moni"));

        postRequest.setEntity(reqEntity);
        HttpResponse response = httpClient.execute(postRequest);

在球衣中,我试图检索消息但只获得对象。代码是:

 @Path("/mobileUserPictureInsert1")
 @POST
 @Consumes("multipart/*")

public String create(MultiPart multiPart){
     BodyPartEntity bpe = (BodyPartEntity) multiPart.getBodyParts().get(0).getEntity();
     String message = bpe.toString();

在这里,我得到了一些对象,而不是消息值。我犯了什么错误。请帮助我。

【问题讨论】:

    标签: java android jersey jersey-2.0


    【解决方案1】:

    是的,正确的结果。 toString() 将只使用 Object.toString(),这将导致

     getClass().getName() + '@' + Integer.toHexString(hashCode())
    

    这很可能是您所看到的。除非BodyEntityPart 覆盖toString(),否则它不会。相反,您应该使用BodyEntityPart.getInputStream() 获得InputStream。然后你可以用InputStream 做任何事情。

    一个简单的例子:

    @POST
    @Consumes("multipart/*")
    public String create(MultiPart multiPart) throws Exception {
        String message;
        try (BodyPartEntity bpe 
                    = (BodyPartEntity) multiPart.getBodyParts().get(0).getEntity()) {
            message = getString(bpe.getInputStream());
        }
        return message;
    }
    
    private String getString(InputStream is) throws Exception {
        StringBuilder builder = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
            String line;
            while((line = reader.readLine()) != null) {
                builder.append(line).append("\n");
            }
        }
        return builder.toString();
    } 
    

    另外说明:您已经在使用 Jersey 多部分支持,您可以让生活更轻松,只需使用它的注释支持。例如,您可以这样做

    @POST
    @Consumes("multipart/*")
    public String create(@FormDataParam("message") String message){
        return message;
    }
    

    这要容易得多。 @FormDataParam("message") 获取您在此处定义的主体名称:

    reqEntity.addPart("message", new StringBody("hi moni"));
    

    并转换为字符串。只要有可用于正文部分的 Content-Type 的 MessageBodyReader,它就应该能够自动转换。

    【讨论】:

    • 谢谢peeskillet...第一种方法效果很好。但是@FormDataParam 不起作用,因为在android 中我没有使用form.just 使用多方。运行时出现以下错误。
    • 这很奇怪。我实际上用您的确切客户端代码对此进行了测试
    • 我在运行应用程序本身时遇到错误。错误是:严重:com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170) at com.sun.jersey.的 StandardWrapper.Throwable com.sun.jersey.spi.inject.Errors$ErrorMessagesException。 com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199) 在 com.sun.jersey.server.impl.application.WebApplicationImpl 的 spi.inject.Errors.postProcess(Errors.java:136)。启动(WebApplicationImpl.java:771)等.....
    • 这很奇怪。该错误显示 Jersey 1 类。您标记了 Jersey 2。请查看我回答中的最后一个链接。在底部,您应该会看到 Multipart 依赖项。你确定你使用的是 Jersey 2 吗? com.sun.jersey 类是 Jersey 1
    • 对不起,我正在使用球衣 1。
    猜你喜欢
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多