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

标签 java rest jersey jax-rs artifactory

我有一组要求,要求 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
}

但是,有两个问题:

安全

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

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

PUT 实体

最重要的是,我不明白 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(???)

但是,我仍然不知道如何/在哪里发送实际的 ZIP 文件。有 path 字段,它似乎指定二进制文件的本地(客户端)路径,但这只是一个字符串/引用,而不是要发布的实际二进制文件!

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

这里有什么想法吗?

最佳答案

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

关于java - 从 Jersey/JAX-RS 客户端将 ZIP 发布到 Artifactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29078787/

相关文章:

java - Jersey REST WS - 请求正文 UTF-8

google-app-engine - 失败的 Jersey REST 服务 : java. lang.IncompatibleClassChangeError:实现类

java - 如何添加偏好页面?

java - 一行的 JtextPane

java - Rest API 方法正在返回值,但仍然收到 500 错误

php - curl_exec 从 Paypal REST Api 返回一个 XMLFault

java - Play 框架 Java Rest API 示例

java - 在 GlassFish 上创建和运行 RESTful Web 服务

java - 依次将 List<Mono<Boolean>> 减少为单个 Mono<Boolean>,如果有返回 false 则中止处理

java - FHIR DSTU2 Java 引用实现 XhtmlParser bug