从 Jersey/JAX-RS 客户端将 ZIP 发布到 Artifactory

Publishing ZIPs to Artifactory from Jersey/JAX-RS Client

我有一组要求,要求 Jersey/JAX-RS 客户端将 ZIP 文件发布到 Artifactory 上的存储库。具体来说,我需要将 ZIP 发布到:

http://artifactory01.example.org/artifactory/simple/libs-release-local/ourorg/somelib/1.0.0/

看起来 Artifactory 公开了一个 PUT endpoint:

PUT /libs-release-local/my/jar/1.0/jar-1.0.jar {
    "uri": "http://localhost:8080/artifactory/libs-release-local/my/jar/1.0/jar-1.0.jar",
    "downloadUri": "http://localhost:8080/artifactory/libs-release-local/my/jar/1.0/jar-1.0.jar",
    "repo": "libs-release-local",
    "path": "/my/jar/1.0/jar-1.0.jar",
    "created": ISO8601 (yyyy-MM-dd'T'HH:mm:ss.SSSZ),
    "createdBy": "userY",
    "size": "1024", //bytes
    "mimeType": "application/java-archive",
    "checksums": {
        "md5" : string,
        "sha1" : string
    },
    "originalChecksums": {
        "md5" : string,
        "sha1" : string
    }
}

因此看起来我需要将 somelib-1.0.0.zip 放入上面确定的 URL。我的建议如下:

// Groovy pseudo-code for the PUT entity:
class Publication {
    @JsonProperty
    String uri

    @JsonProperty
    String downloadUri

    @JsonProperty
    String repo

    @JsonProperty
    String path

    @JsonProperty
    Date created

    @JsonProperty
    String createdBy

    @JsonProperty
    Integer size

    @JsonProperty
    String mimeType

    @JsonProperty
    Map<String,String> checksums

    @JsonProperty
    Map<String,String> originalChecksums
}

但是,2个问题:

安全

此端点的安全约束要求用户具有 'deploy' 权限。我有这样的用户,但是我不确定如何在客户端实现此身份验证。 Artifactory 是否对其端点使用基本身份验证?如果是这样,这样的事情会有效吗(?):

Client client = Client.create();
WebResource resource = client.resource(BASE_URI);
client.addFilter(new HTTPBasicAuthFilter("deployuser", "12345"));   // dummy credentials, obviously

放置实体

最重要的是,我不明白 PUT 实体应该是什么。使用 Jersey/JAX-RS 样式的 POJO,我可能会这样做:

// Again, Groovy pseudo-code
Publication publication = getSomehow()  // Ideally ZIP is read into portable format by this point

webResource.path("libs-release-local").path("ourorg").path("somelib").path("1.0.0").path("somelib-1.0.0.zip")
    .type(MediaType.???).entity(publication).put(???)

但是,我仍然没有看到 how/where 我发送了实际的 ZIP 文件。有一个 path 字段,它似乎指定了二进制文件的本地(客户端)路径,但这只是一个 string/reference,而不是要发布的实际二进制文件!

此外,根据维基百科,ZIP 媒体类型是 application\zip,但 JAX-RS 中没有这样的 MediaType 定义。

有什么想法吗?

基本身份验证很好。 重新实体,你不需要任何。您在文档中看到的 JSON 是 PUT 调用的 结果