【问题标题】:How can I make a PATCH request (with SSL) in Java?如何在 Java 中发出 PATCH 请求(使用 SSL)?
【发布时间】:2021-02-09 18:20:32
【问题描述】:

我需要我的 Java 应用程序使用 SSL 向 Web 服务器发出 PATCH 请求。

我尝试了以下方法:

public String patchForm(FormDataMultiPart f, Map<String,String> headers) {
        Entity<FormDataMultiPart> entity = Entity.entity(f, f.getMediaType());
        webTarget.property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true);
        Builder request = webTarget.request();
        if (headers != null){
            for (String key : headers.keySet()){
                request = request.header(key, headers.get(key));
            }
        }
        Response result = request.method("PATCH", entity);
        return result.readEntity(String.class);
    }

其中Entityjavax.ws.rs.client.EntitywebTargetjavax.ws.rs.client.WebTarget

但是,当我发出请求时,服务器将其解释为 POST 请求并给我错误的响应。

问题的原因可能是什么?有什么办法可以解决吗?

提前谢谢你。

【问题讨论】:

    标签: java rest https


    【解决方案1】:

    对于补丁,您需要设置要访问的网址以确保安全。 例如

    您的 webTarget 将拥有

    webTarget.path("https://secureUrlWichWillForceSsl.com");
    

    如果它以 http:// 开头,它将不安全且没有 SSL。

    【讨论】:

    • 谢谢,但问题不在于 SSL,而在于补丁方法本身。由于某种原因,服务器将请求解释为 POST 而不是 PATCH。
    【解决方案2】:

    经过大量试验和错误,执行和撤消,将 _HttpMethod=PATCH 添加到查询字符串然后将其删除,因为事实证明这不是必需的,特别是在导致 patchForm 的开关关闭中添加缺少的中断根本不调用函数(是的,这是一个愚蠢的疏忽,花费了我数小时的工作时间),然后修复了不断出现的错误,我终于找到了可行的方法。

    最终成功的代码如下:

    public String patchForm(FormDataMultiPart f, Map<String,String> headers) {
            Entity<FormDataMultiPart> entity = Entity.entity(f, f.getMediaType());
            webTarget.register(MultiPartFeature.class);
            webTarget.property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true);
            Builder request = webTarget.request();
            headers.put("X-HTTP-Method-Override", "PATCH");
            if (headers != null){
                for (String key : headers.keySet()){
                    request = request.header(key, headers.get(key));
                }
            }
            Response result = request.patch(entity);
            return result.readEntity(String.class);
    }
    

    请注意,Builder 类有一个内置的patch 方法。我正在使用一个没有它的旧图书馆。然而,该方法的变通方法仍然是必要的,否则我会得到一个异常,因为 PATCH 方法是非标准的。

    还要注意,在提交多部分表单时,注册多部分功能很重要。我读过可以通过覆盖configureClient 方法(在编写自定义客户端时)或在Web 目标上注册它。在网络目标上执行此操作更适合我的需求,但您可以以最适合您的方式执行此操作。

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 2022-11-24
      • 2011-10-14
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多