标签: java-http-client

Java 11 连接重置(间歇性)

我使用Java11httpclient 4.5.11制作要求的API,到目前为止一切正常。但是一个多星期前付款https://api.moip.com.br开始出现间歇性错误(Connection reset)。

我知道他们需要 TLSv1.2 并且 Java11 支持它,而且错误是间歇性的(有时它起作用,有时不起作用)。我联系了他们,他们说他们迁移了他们的代码库,但他们处理请求的配置是相同的,我对此表示怀疑,但无论如何,考虑到他们处理多个组织的付款,我认为有一些东西我可以做些什么来避免这些错误。作为旁注,我可以毫无问题地向 PayPal、Stripe、Google Recaptcha 以及其他服务提出请求。

我如何创建连接:

try (CloseableHttpClient httpClient = createHttpClientBuilder().build()) {
    HttpUriRequest httpMethod = createHttpUriRequest(request);
    HttpResponse httpResponse = httpClient.execute(httpMethod);
    SimpleHttpClientResponse response = createResponse(httpResponse);
    return response;
} catch (Exception e) {
    throw new HTTPException(request, e);
}
Run Code Online (Sandbox Code Playgroud)

以下是我如何创建连接管理器、客户端构建器和请求本身:

private static HttpClientBuilder createHttpClientBuilder() throws KeyManagementException, NoSuchAlgorithmException {
    CookieStore httpCookieStore = new BasicCookieStore();
    RequestConfig defaultRequestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();

    HttpClientBuilder builder = HttpClients.custom()
            .setConnectionManager(connectionManager)
            .setConnectionManagerShared(true)
            .setDefaultCookieStore(httpCookieStore)
            .setDefaultRequestConfig(defaultRequestConfig);

    return builder;
}

private …
Run Code Online (Sandbox Code Playgroud)

java java-http-client java-11

5
推荐指数
0
解决办法
2351
查看次数

如何为 Java 11 HttpRequest 创建自定义 BodyPublisher

我正在尝试创建一个自定义BodyPublisher来反序列化我的 JSON 对象。我可以在创建请求时反序列化 JSON 并使用 的ofByteArray方法,BodyPublishers但我宁愿使用自定义发布者。

public class CustomPublisher implements HttpRequest.BodyPublisher {
    private byte[] bytes;
    
    public CustomPublisher(ObjectNode jsonData) {
        ...
        // Deserialize jsonData to bytes
        ...
    }
    
    @Override
    public long contentLength() {
        if(bytes == null) return 0;
        return bytes.length
    }
    
    @Override
    public void subscribe(Flow.Subscriber<? super ByteBuffer> subscriber) {
        CustomSubscription subscription = new CustomSubscription(subscriber, bytes);
        subscriber.onSubscribe(subscription);       
    }

    private CustomSubscription implements Flow.Subscription {
         private final Flow.Subscriber<? super ByteBuffer> subscriber;
         private boolean cancelled;
         private Iterator<Byte> byterator;

         private …
Run Code Online (Sandbox Code Playgroud)

java java-http-client java-11

5
推荐指数
1
解决办法
884
查看次数

如何在Java8项目中使用Http Client API(自java 9起)

Java 9导入一个新的HTTP/2客户端API,它似乎很好用,但有没有办法在Java 8中使用它?

要么

是否有任何shim/ polyfill(来自javascript)可以在Java 8中使用它?

java java-8 http2 java-9 java-http-client

4
推荐指数
1
解决办法
1444
查看次数

在简单的纯Java 11 WebSocket客户端示例中需要帮助

网上似乎很少有Java 11(基于纯Java非框架的)WebSocket 客户端代码示例,因此我希望StackOverflow可以再次为我提供帮助。

是我找到的最接近的东西,但是不幸的是,在我(新手)的眼里,它似乎不是显示如何使用WebSocket侦听器中的数据的完整解决方案。

看一下WebSocket.Listener的实现,我假定的onText回调方法将提供我所需要的东西,但是我在努力弄清楚如何从套接字返回CompletionStage对象和某种字符串数据。

这是我到目前为止的一些测试代码。

希望得到帮助。谢谢

    public class Main {

        public static void main(String[] args) {

           WebSocketClient wsc = new WebSocketClient();
           wsc.startSocket("ws://demos.kaazing.com/echo");

           int i = 0;   

           // Bad, very bad
           do {} while (i == 0);
        }
    }


    public class WebSocketClient implements WebSocket.Listener {

        @Override
        public void onOpen(WebSocket webSocket) {
           //...
            System.out.println("Go...Open".concat(
                    webSocket.getSubprotocol()));
        }

        @Override
        public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) {
           //...
            System.out.println(data.toString());

            // How do I return the CompletionStage …
Run Code Online (Sandbox Code Playgroud)

websocket java-http-client java-11

4
推荐指数
1
解决办法
932
查看次数

如何在 Java 11 中读取 HttpRequest 的主体?

在测试中,我想查看 HttpRequest 的主体内部。我想将身体作为字符串。似乎唯一的方法是订阅 BodyPublisher 但这如何工作?

java httprequest java-flow java-http-client java-11

4
推荐指数
1
解决办法
2540
查看次数

如何使用 HTTP 选项方法和 HTTPClient (Java 11) 发送请求?

正如标题所说,我想知道如何使用 Java 中的 OPTIONS 方法使用 HTTPClient 发送 HTTP 请求。我查看了可以使用的 HTTP 方法(GET、POST、PUT 和 DELETE),但我还没有看到这个选项。使用 HTTPClient 的 GET/POST 请求示例如下:

String uri = "https://www.stackoverflow.com/"
HttpRequest.Builder preRequest=null;

// EXAMPLE OF GET REQUEST
preRequest = HttpRequest.newBuilder()
.uri(URI.create( uri ))
.GET();

// EXAMPLE OF POST REQUEST
preRequest = HttpRequest.newBuilder()
.uri(URI.create( uri ))
.POST(BodyPublishers.ofString(req.getBody()));  // "req" is an object of a class made by me, it does not matter in this context
Run Code Online (Sandbox Code Playgroud)

如果它不能使用(这对我来说似乎非常罕见),我可以使用什么替代方法?

非常感谢您提前!

java http options http-method java-http-client

4
推荐指数
1
解决办法
849
查看次数

如何使用 Java 11 HTTP 客户端进行抢先身份验证?

我正在尝试使用基本身份验证对经过身份验证的服务使用 Java 11 HTTP 客户端。身份验证成功进行,但它会与服务器进行额外的往返,以了解它应该发送身份验证数据。

已搜索文档和代码,在内部某个时刻它使用某种缓存,但我无法设置缓存值。

这是我的客户端代码:

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("http://someurl.com"))
        .build();

HttpClient client = HttpClient.newBuilder()
        .authenticator(new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("user", "pass".toCharArray());
            }
        })
        .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
Run Code Online (Sandbox Code Playgroud)

我期望的是,我可以以某种方式告诉客户端抢先发送身份验证数据,而不仅仅是在服务器请求时发送。

basic-authentication java-http-client java-11

4
推荐指数
1
解决办法
3404
查看次数

有没有办法使用 Java 11 的 HttpClient 从 HTTP 1.1 响应的状态行中获取 Reason-Phrase?

Javajava.net.HttpURLConnection有一个getResponseMessage()方法来检索任何Reason-Phrase文本(如RFC2616 6.1 Status Line所指定)。

在较新的 Java 11 HttpClient 中,java.net.http.HttpResponse只有一个statusCode()方法。

有没有办法使用此 API 获取状态行末尾返回的文本?如果没有,为什么不包括在内?(我知道 HTTP 2没有定义这个值,但大多数应用程序仍然使用 HTTP 1.1,它仍然有效。)

java java-http-client

4
推荐指数
1
解决办法
405
查看次数

如何限制 java.net.http.HttpClient 的连接

如何限制java.net.http.HttpClient的连接/请求数量?

我看到我可以将 Executor 设置为 HttpClient 但我不知道:如果我限制 Executor 池中的线程数,是否也会限制连接数?

还有一种方法可以限制连接数?

java java-http-client

4
推荐指数
1
解决办法
2143
查看次数

如何将基于多个条件的标头添加到 HttpRequest Java 11?

我正在学习java.net.http api,尝试下载已下载的字节范围的文件。为此,range可以使用标头(假设服务器支持此类功能)。

使用org.apache.http.client.methods.HttpGet我可以做到这一点:

HttpGet httpGet= new HttpGet("http://exampleURL.com/aFile");
if (myFile.length() > 0) {
            httpGet.addHeader("Range", "bytes=" + myFile.length() + "-"+totalBytes));
}
httpGet.addHeader("xxxx", "yyyy");//ok
Run Code Online (Sandbox Code Playgroud)

现在使用 HttpRequest 我无法动态添加新标头,我必须创建一个新的整个 HttpRequest:

HttpRequest request = null;
if (myFile.length() > 0) {
  request = HttpRequest.newBuilder()
      .uri(URI.create("http://exampleURL.com/aFile"))
      .header("Range","bytes="+myFile.length() +"-"+ totalBytes)
      .build();
}else{
  request = HttpRequest.newBuilder()
      .uri(URI.create("http://exampleURL.com/aFile"))
      .build();
}
request.header("xxxx","yyyyy")//Can't do this anymore
Run Code Online (Sandbox Code Playgroud)

我有办法动态添加它们吗?

我看到文档说:

HttpRequest 构建后是不可变的,并且可以多次发送。

但是不可变有什么意义呢?如果我出于任何原因需要修改标题怎么办?

参考:

https://openjdk.java.net/groups/net/httpclient/intro.html

java httprequest http-headers java-http-client java-11

3
推荐指数
1
解决办法
3966
查看次数