Dropwizard Jersey客户端Multipart http请求

时间:2016-01-22 12:18:46

标签: java rest http dropwizard jersey-client

Dropwizard(版本0.8.2)在内部使用Jersey来提供HTTP客户端。我正在使用此客户端将多部分POST请求发送到外部Rest端点到SMS服务。下面给出了代码,但它似乎没有工作,因为我没有通过这种方法接收任何消息,也没有抛出任何错误。 第一个示例的 URI http://enterprise.com/GatewayAPI/rest?userid=%s&password=%s&method=xlsUpload&filetype=zip&msg_type=TEXT&auth_scheme=PLAIN&v=1.1

FileDataBodyPart fileDataBodyPart = new FileDataBodyPart(fileName, file,
                                                        MediaType.APPLICATION_OCTET_STREAM_TYPE);
      FormDataMultiPart multiPart = new FormDataMultiPart();

      multiPart.field("fileName", fileName).bodyPart(fileDataBodyPart);
      Entity<FormDataMultiPart> entity =
          Entity.entity(multiPart, multiPart.getMediaType());// MediaType.MULTIPART_FORM_DATA_TYPE)

      Client tenacityClient = TenacityJerseyClientBuilder
          .builder(AppDependencyKeys.BULK_SMS)
          .usingTimeoutPadding(Duration.milliseconds(500)).build(client)
          .register(MultiPartFeature.class);

      Invocation invocation = getResourceBuilder(tenacityClient, uri).buildPost(entity);
      Future<Response> futureResponse = invocation.submit();
      long start = System.currentTimeMillis();

      futureResponse.get();

但是当我使用Apache Commons Httpclient时,同样适用于以下方法。下面给出了相同的工作代码。

HttpClient client = new HttpClient();
    PostMethod method = new
        PostMethod("http://enterprise.com/GatewayAPI/rest");
    Part[] parts = {
        new StringPart("method", "xlsUpload"),
        new StringPart("userid", "*******"),
        new StringPart("password", "*******"),
        new StringPart("filetype", "zip"),
        new StringPart("v", "1.1"),
        new StringPart("auth_scheme", "PLAIN"),
        new FilePart(file.getName(), file)
    };
    method.setRequestEntity(new MultipartRequestEntity(parts, method.getParams()));
    int statusCode = client.executeMethod(method);
    log.info("Status code: {}", statusCode);

但我想使用第一种方式,因为它更适合我的基础设施。

1 个答案:

答案 0 :(得分:0)

我认为您应该为实体设置正确的媒体类型。目前,您创建了新的FormDataMultiPart,但是没有设置和媒体类型,它使用默认的“text / plain”。

因此,您应将MediaType.APPLICATION_OCTET_STREAM_TYPE设置为FormDataMultiPart作为媒体类型。