当前位置: 首页 > 知识库问答 >
问题:

HttpURLConnection无效的HTTP方法:修补程序

逄岳
2023-03-14

当我尝试使用非标准的HTTP方法时,比如带有URLConnection的补丁:

    HttpURLConnection conn = (HttpURLConnection) new URL("http://example.com").openConnection();
    conn.setRequestMethod("PATCH");

我有个例外:

java.net.ProtocolException: Invalid HTTP method: PATCH
at java.net.HttpURLConnection.setRequestMethod(HttpURLConnection.java:440)

使用更高级别的API(如Jersey)会产生相同的错误。是否有解决办法来发出修补程序HTTP请求?

共有3个答案

孔砚
2023-03-14

OpenJDK中有一个无法修复的错误:https://bugs.openjdk.java.net/browse/JDK-7016595

然而,使用ApacheHTTP组件客户端4.2,这是可能的。它有一个定制的网络实现,因此可以使用所有标准的HTTP方法,比如PATCH。它甚至有一个支持补丁方法的HttpPatch类。

CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPatch httpPatch = new HttpPatch(new URI("http://example.com"));
CloseableHttpResponse response = httpClient.execute(httpPatch);

Maven坐标:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.2+</version>
</dependency>
秋光熙
2023-03-14

是的,这是有解决办法的。使用

X-HTTP-方法-覆盖

。此标头可用于POST请求中“伪造”其他HTTP方法。只需将X-HTTP-Method-Override头的值设置为您希望实际执行的HTTP方法。所以请使用以下代码。

conn.setRequestProperty("X-HTTP-Method-Override", "PATCH");
conn.setRequestMethod("POST");
徐奇逸
2023-03-14

有很多很好的答案,下面是我的(不适用于jdk12):

import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;

public class SupportPatch {
    public static void main(String... args) throws IOException {
        allowMethods("PATCH");

        HttpURLConnection conn = (HttpURLConnection) new URL("http://example.com").openConnection();
        conn.setRequestMethod("PATCH");
    }

    private static void allowMethods(String... methods) {
        try {
            Field methodsField = HttpURLConnection.class.getDeclaredField("methods");

            Field modifiersField = Field.class.getDeclaredField("modifiers");
            modifiersField.setAccessible(true);
            modifiersField.setInt(methodsField, methodsField.getModifiers() & ~Modifier.FINAL);

            methodsField.setAccessible(true);

            String[] oldMethods = (String[]) methodsField.get(null);
            Set<String> methodsSet = new LinkedHashSet<>(Arrays.asList(oldMethods));
            methodsSet.addAll(Arrays.asList(methods));
            String[] newMethods = methodsSet.toArray(new String[0]);

            methodsField.set(null/*static field*/, newMethods);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            throw new IllegalStateException(e);
        }
    }
}

它也使用反射,但不是黑客进入每个连接对象,我们黑客HttpURLConnection#方法静态字段,用于内部检查。

 类似资料:
  • 尝试了HttpURLConnection的其他解决方案后,无效的HTTP方法:PATCH 我得到无效的HTTP方法:补丁异常与JAVA 7。更新JAVA不在选项中,所以我必须坚持使用解决方法。 我正在使用调用来调用这样的请求 < code>getHTTPVerb()返回字符串“POST”或“PATCH”。 使用补丁方法我遇到了问题。 在提到的问题中,我没有尝试过一种解决方案: < code>con

  • 当我试图在一个基于Spring MVC的应用程序上使用PayPal REST API更新一个账单计划的状态时,我遇到了一个ProtocolException。我的堆栈跟踪如下: 原因:java.net.ProtocolException:无效HTTP方法:PATCH at Java . net . httpurlconnection . setrequest method(httpurlconne

  • 我正在尝试进行http补丁请求,但我总是得到404错误,所以可能是我的连接设置不正确: 我收到404错误,未找到。当使用Postman执行相同的请求时,这是有效的…谢谢你的帮助。

  • 当我尝试点击具有方法的请求时,我收到以下错误:PATCH 使用JMeter版本:-apache-JMeter-5.4.1 如果我能得到专家的帮助来解决他们的问题,那将会很有帮助。 谢谢

  • 我有一个带有spring框架的Java8应用程序。我们需要从应用程序中使用REST调用补丁操作。 代码片段如下: 请指教。

  • 当我将颤振版本升级到1.7.8修补程序时,我收到了几条错误消息。3. 以下是消息: 这是我的颤振医生信息: 医生摘要(要查看所有详细信息,请运行flutter医生-v): [√] Flutter(Channel稳定,v1.7.8热修复补丁.3,在Microsoft Windows上[版本10.0.17134.885 ]) [!] Android工具链-为Android设备开发(AndroidSDK