我使用Java11和httpclient 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) 我正在尝试创建一个自定义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 9导入一个新的HTTP/2客户端API,它似乎很好用,但有没有办法在Java 8中使用它?
要么
是否有任何shim/ polyfill(来自javascript)可以在Java 8中使用它?
网上似乎很少有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) 在测试中,我想查看 HttpRequest 的主体内部。我想将身体作为字符串。似乎唯一的方法是订阅 BodyPublisher 但这如何工作?
正如标题所说,我想知道如何使用 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 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)
我期望的是,我可以以某种方式告诉客户端抢先发送身份验证数据,而不仅仅是在服务器请求时发送。
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.net.http.HttpClient的连接/请求数量?
我看到我可以将 Executor 设置为 HttpClient 但我不知道:如果我限制 Executor 池中的线程数,是否也会限制连接数?
还有一种方法可以限制连接数?
我正在学习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 构建后是不可变的,并且可以多次发送。
但是不可变有什么意义呢?如果我出于任何原因需要修改标题怎么办?
参考:
java-http-client ×10
java ×8
java-11 ×6
httprequest ×2
http ×1
http-headers ×1
http-method ×1
http2 ×1
java-8 ×1
java-9 ×1
java-flow ×1
options ×1
websocket ×1