如何在Android中使用DefaultHttpClient?
android httpwebrequest apache-commons-httpclient apache-httpclient-4.x
我需要发送一个byte []来休息Web服务端点,我想知道如何使用HTTPClient的PostMethod设置请求,任何想法?
我有一个应用程序连接到需要基本身份验证的站点.这些站点在运行时提供,在编译时不知道.
我正在使用HttpClient 4.2.
我不确定下面的代码是否应该如何指定基本身份验证,但文档会建议它.但是,我不知道在构造函数中传递什么AuthScope.我原以为null参数意味着所提供的凭据应该用于所有URL,但它会抛出一个NullPointerException,所以显然我错了.
m_client = new DefaultHttpClient();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(m_userName, m_password);
((DefaultHttpClient)m_client).getCredentialsProvider().setCredentials(new AuthScope((HttpHost)null), credentials);
Run Code Online (Sandbox Code Playgroud) java httpclient apache-commons-httpclient apache-httpclient-4.x
在HttpClient中创建cookie有不同的方法,我很困惑哪一个是最好的.我需要创建,检索和修改cookie.
例如,我可以使用以下代码查看cookie列表并修改它们但是如何创建它们?
这是检索它们的正确方法吗?我需要它们在所有类中都可访问.
码
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
public class GetCookiePrintAndSetValue {
public static void main(String args[]) throws Exception {
HttpClient client = new HttpClient();
client.getParams().setParameter("http.useragent", "My Browser");
GetMethod method = new GetMethod("http://localhost:8080/");
try{
client.executeMethod(method);
Cookie[] cookies = client.getState().getCookies();
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
System.err.println(
"Cookie: " + cookie.getName() +
", Value: " + cookie.getValue() +
", IsPersistent?: " + cookie.isPersistent() +
", Expiry Date: " …Run Code Online (Sandbox Code Playgroud) 我想在服务A和B之间使用相互SSL身份验证.我目前正在实现从Java中的服务A传递客户端证书.我正在使用Apache DefaultHttpClient来执行我的请求.我能够从内部凭据管理器检索我的服务A的客户端证书,并将其保存为字节数组.
DefaultHttpClient client = new DefaultHttpClient();
byte [] certificate = localCertManager.retrieveCert();
Run Code Online (Sandbox Code Playgroud)
我在这方面的经验很少,我很感激你的帮助!
我想也许它应该以某种方式通过HTTP客户端或可能在标头中的参数传递.
如何使用HTTP客户端传递客户端证书?
我已经将Apache的 HttpClient 4.3.3添加到我的build.gradle文件中,如Apache所述,但是我的应用程序的大小没有变化.因此,我很确定,虽然我的IDE将httpclient-android-4.3.3显示为外部库,但我的应用程序实际上并没有包含和使用它.
我试图根据这篇文章验证http客户端的版本,但VersionInfo.loadVersionInfo()一直返回null.
我的问题归结为:
在以前的版本中,HttpClient目标主机已设置为客户端本身。在最新版本(对于HttpAsyncClient4.1.1)中,每次执行请求时,主机都设置为HttpRequest(HttpGet,HttpPost等等。)。
我想使用持久连接,所以我使用HttpAsyncClient。我这样创建和使用它:
CloseableHttpAsyncClient client = HttpAsyncClients.createDefault();
client.start();
List<Future<HttpResponse>> responses = new ArrayList<>();
for (int i = 0; i < 10; i++)
{
HttpGet get = new HttpGet("https://google.com/");
responses.add(client.execute(get, null));
}
for (Future<HttpResponse> response : responses) {
response.get(); //wait for the response
}
Run Code Online (Sandbox Code Playgroud)
如我所测试,它的工作速度比平常更快HttpClient(如果我执行所有请求,然后等待所有响应)。
但是我无法完全了解它是如何工作的。https://google.com/建立了多少个连接?如果我使用client一台主机,然后再使用另一台主机会怎样?(正如我测试的那样,响应可以以任何顺序进行,因此我想至少有2个并行连接)。HttpAsyncClients.createDefault()和之间有什么区别HttpAsyncClients.createPipelining()?
谢谢!
java apache-httpcomponents apache-commons-httpclient apache-httpclient-4.x apache-httpasyncclient
从Mono#block() 的官方文档中可以看出:
订阅此 Mono 并无限期阻塞,直到收到下一个信号。返回该值,如果 Mono 完成为空,则返回 null。如果 Mono 出错,则会抛出原始异常(如果是受检查的异常,则将其包装在 RuntimeException 中)。
因此可以肯定 block() 方法是阻塞的,并且在解决之前它不会执行下一行block()。
但我的困惑是,当我使用时,toFuture()期望它是非阻塞的,但它的行为与block方法完全相同。在Mono#toFuture() 的文档中指出:
将此 Mono 转换为 CompletableFuture 在 onNext 或 onComplete 上完成并在 onError 上失败。
不太清楚。本文档中没有任何地方说Mono#toFuture()阻塞。
toFuture()方法是阻塞还是非阻塞?CompletableFuture?更新:添加了代码片段
使用Mono.block()方法:
long time = System.currentTimeMillis();
String block = Mono.fromCallable(() -> {
logger.debug("inside in fromCallable() block()");
//Upstream httpcall with apache httpClient().
// which takes atleast 1sec …Run Code Online (Sandbox Code Playgroud) 我们一直在与我们的数据提供者之一讨论来自我们的 HTTP 请求的某些请求由于“连接重置”异常而间歇性失败的问题,但我们也看到了“目标服务器无法响应”异常。
许多 Stack Overflow 帖子都指出了一些潜在的解决方案,即
我希望这个问题能帮助我找到根本原因。
语境
它是托管在 AWS Elastic Beanstalk 中的 Java Web 应用程序,具有基于负载的 2..4 个服务器。Java WAR 文件使用 HttpClient 4.5.12 进行通信。在过去的几个月里,我们看到
45 x 连接重置(只有 3 个超时超过 30 秒,其他在 20 毫秒内失败)
考虑到这一点,我们对该供应商执行了 10,000 个请求,因此错误率并不高,但非常不方便,因为我们的客户为随后失败的服务付费。
目前,我们正试图专注于消除“连接重置”场景,并建议我们尝试以下方法:
1)重启我们的应用服务器(一个绝望的以防万一的场景)
2) 更改 DNS 服务器以使用 Google 8.8.8.8 & 8.8.4.4(因此我们的请求采用不同的路径)
3) 为每个服务器分配一个静态 IP(这样它们就可以使我们无需通过他们的 CloudFront 分配即可进行通信)
我们将通过这些建议,但同时我想了解我们的 HttpClient 实现可能不太正确的地方。
典型用法
用户请求 --> 我们的服务器(JAX-RS 请求) --> HttpClient 到第 3 方 --> 收到响应,例如 JSON/XML --> …
java httpclient apache-commons-httpclient apache-httpclient-4.x
我正在尝试通过需要使用Apache HttpClient 4.3.1进行抢先身份验证的代理发送HTTPS请求。
当我在第一个请求中未直接对自己进行身份验证时,代理会阻止与IP的连接几分钟。
我对正常的HTTP请求没有任何问题,只是将“ Proxy-Authorization”标头手动添加到了请求中。
但是,当尝试加载HTTPS页面时,HttpClient似乎使用了HTTP隧道,因此第一个请求是“ CONNECT”命令,然后发送我的实际请求。使用request.setHeader(...)方法不会影响CONNECT请求的标头,从而导致出现“需要HTTP / 1.0 407代理身份验证”响应并关闭我的连接。之后,HttpClient再次连接,这次使用我的凭据添加“ Proxy-Authorization”标头字段。
连接成功(建立了HTTP / 1.0 200连接),并且正在执行我的实际GET请求。但是,之后我再次运行程序时,将得到IOException:
信息:处理请求时捕获了I / O异常(java.net.SocketException):连接重置
在Wireshark中,我可以看到代理不再响应我的“ CONNECT”请求(不包含凭据)。因此,我尝试了几种方法来使HttpClient在第一个CONNECT请求中发送凭据:我修改了此示例以使用代理,并为代理创建了AuthCache,但是它不起作用。我还尝试将HttpRequestInterceptor添加到我的客户端:
static class PreemptiveAuth implements HttpRequestInterceptor {
@Override
public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException {
request.setHeader("Proxy-Authorization", "Basic <base64credentials>");
}
}
Run Code Online (Sandbox Code Playgroud)
但这也不会影响“ CONNECT”请求。这是我其余的代码:
public class ClientProxyAuthentication {
public static void main(String[] args) throws IOException, InterruptedException {
HttpHost targetHost = new HttpHost("www.google.com", 443, "https");
HttpHost proxy = new HttpHost("<proxy-ip>", 21265, "http");
CredentialsProvider credsProvider = new …Run Code Online (Sandbox Code Playgroud) authentication proxy httpclient apache-commons-httpclient apache-httpclient-4.x