我一直在查看摘要认证示例:
http://hc.apache.org/httpcomponents-client-4.3.x/examples.html
在我的场景中,有几个线程发出HTTP请求,并且每个线程都必须使用自己的一组凭据进行身份验证.另外,请考虑这个问题可能非常具体针对Apache HTTP客户端4.3以上,4.2可能以不同的方式处理身份验证,尽管我自己没有检查它.也就是说,实际问题就出现了.
我想只使用一个客户端实例(该类的静态成员,即线程安全)并为其提供连接管理器以支持多个并发请求.关键是每个请求都会提供不同的凭据,我没有看到为每个请求分配凭据的方法,因为在构建http客户端时设置了凭据提供程序.从上面的链接:
[...]
HttpHost targetHost = new HttpHost("localhost", 80, "http");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope(targetHost.getHostName(), targetHost.getPort()),
new UsernamePasswordCredentials("username", "password"));
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider).build();
Run Code Online (Sandbox Code Playgroud)
[...]
检查:
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html#d5e600
第4.4点(寻求4.4.HTTP认证和执行上下文)中的代码示例似乎表示HttpClientContext被赋予auth高速缓存和凭证提供者,然后被传递给HTTP请求.在它旁边执行请求,似乎客户端将在HTTP请求中获得主机的凭据过滤.换句话说:如果上下文(或缓存)具有当前HTTP请求的目标主机的有效凭据,则他将使用它们.对我来说问题是不同的线程将对同一主机执行不同的请求.
有没有办法为每个HTTP请求提供自定义凭据?
在此先感谢您的时间!:)
http credentials digest apache-httpcomponents apache-httpclient-4.x
我正在尝试同时做多个HttpGet请求CloseableHttpClient.
我搜索了如何做到这一点,答案是使用一个PoolingHttpClientConnectionManager.
此时我得到了这个:
PoolingHttpClientConnectionManager cManager = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cManager)
.build();
Run Code Online (Sandbox Code Playgroud)
然后我尝试了一个HttpGet请求http://www.google.com,一切正常.
然后,我通过创建一个CMD信任和进口目标网站的证书,设置一个SSLConnectionSocketFactory与我的信任和设置SSLSocketFactory的httpClient:
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream inputStream = new FileInputStream(new File("myTrustStore.truststore"));
trustStore.load(inputStream, "nopassword".toCharArray());
inputStream.close();
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
PoolingHttpClientConnectionManager cManager = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.setConnectionManager(cManager)
.build();
Run Code Online (Sandbox Code Playgroud)
如果我尝试执行Https,HttpGet那么我会得到一个PKIX path building failed例外.
如果我做同样的.setConnectionManager(cManager)事情,一切正常.
谁能告诉我如何让这个工作?(别担心,我不创建任何ddos工具)
提前致谢! …
处理特定网站时,有时我会收到状态码为403的http响应.我想在这种情况下重新执行请求(因为,在我的特定情况下,此服务器在实际超载时会抛出403).我试图和a ResponseHandler一起使用StandardHttpRequestRetryHandler,但它没有按照我希望的方式工作; 我期望在ResponseHandler触发器中抛出异常会触发StandardHttpRequestRetryHandler,但似乎并非如此.如何实现所需的功能?
这是一个示例代码,说明了我的情况:
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.StandardHttpRequestRetryHandler;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
public class Main {
public static void main(String[] args) throws Exception {
// a response handler that throws an exception if status is not 200
ResponseHandler<String> responseHandler = new ResponseHandler<String> () {
@Override
public String handleResponse(HttpResponse response) throws
ClientProtocolException, IOException
{
System.out.println("-> Handling response");
if (response.getStatusLine().getStatusCode() != …Run Code Online (Sandbox Code Playgroud) 我正在使用apache http客户端v4.5并将其用作REST客户端.在某些情况下,我识别出一个错误"[读取] I/O错误:读取超时",它来自httpclient框架,当它读取接收到的内容并将其显示为最后一条消息时.
它似乎没有影响,但我想知道是否有人知道它来自何处以及如何解决它.根据以下线程(链接),似乎是"mutlithreaded"配置的问题.
但是我只使用http客户端的默认配置,当我使用版本v4时,我不知道如何将"multithreaded"设置为false以查看它是否有任何区别.
我也试图设置超时但它没有帮助.
任何提示?
日志:
15:48:05.984 [main] DEBUG org.apache.http.wire - http-outgoing-8 << "HTTP/1.1 200 OK[\r][\n]"
15:48:05.984 [main] DEBUG org.apache.http.wire - http-outgoing-8 << "Date: Tue, 29 Dec 2015 14:48:03 GMT[\r][\n]"
15:48:05.984 [main] DEBUG org.apache.http.wire - http-outgoing-8 << "Server: Apache/2.4.12 (Win32) OpenSSL/1.0.1l PHP/5.6.8[\r][\n]"
15:48:05.984 [main] DEBUG org.apache.http.wire - http-outgoing-8 << "X-Powered-By: PHP/5.6.8[\r][\n]"
15:48:05.985 [main] DEBUG org.apache.http.wire - http-outgoing-8 << "Cache-Control: nocache, private[\r][\n]"
15:48:05.985 [main] DEBUG org.apache.http.wire - http-outgoing-8 << "Content-Length: 99[\r][\n]"
15:48:05.985 [main] DEBUG org.apache.http.wire - http-outgoing-8 …Run Code Online (Sandbox Code Playgroud) java multithreading timeout httpclient apache-httpcomponents
我正在尝试使用java程序连接到smartsheet api.最初我遇到了站点证书的问题,该证书通过将其添加到java密钥库来解决.现在,当我尝试运行我的代码时,我收到以下错误.
Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<clinit>(SSLConnectionSocketFactory.java:144)
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:955)
at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58)
at com.smartsheet.api.internal.http.DefaultHttpClient.<init>(DefaultHttpClient.java:64)
at com.smartsheet.api.SmartsheetBuilder.build(SmartsheetBuilder.java:203)
at SmartsheetConnection.main(SmartsheetConnection.java:13)
Run Code Online (Sandbox Code Playgroud)
这是我的代码(我按照他们的文档).
import com.smartsheet.api.*;
import com.smartsheet.api.models.*;
import com.smartsheet.api.models.enums.*;
import com.smartsheet.api.oauth.*;
public class SmartsheetConnection {
public static void main(String[] args) throws SmartsheetException {
// Set the access token.
Token token = new Token();
token.setAccessToken("foo");
Smartsheet smartsheet = new SmartsheetBuilder().setAccessToken(token.getAccessToken()).build();
}
}
Run Code Online (Sandbox Code Playgroud)
投掷错误的行是(第144行)
@Deprecated
public static final X509HostnameVerifier ALLOW_ALL_HOSTNAME_VERIFIER
= AllowAllHostnameVerifier.INSTANCE;
Run Code Online (Sandbox Code Playgroud)
但我不知道该怎么做.我正在使用maven来获取依赖项.它与Apache HttpComponents的版本有关吗?
这是pom.xml
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target> …Run Code Online (Sandbox Code Playgroud) 我通过DefaultHttpClient提交多个HTTP请求.问题是从未在请求中设置"主机"标头.例如,通过执行以下GET请求:
HttpUriRequest request = new HttpGet("http://www.myapp.com");
org.apache.http.client.HttpClient client = new DefaultHttpClient();
HttpResponse httpResponse = client.execute(request);
Run Code Online (Sandbox Code Playgroud)
生成的请求对象不会使用以下值设置必需的"主机"标头:
Host: myapp.com
Run Code Online (Sandbox Code Playgroud)
有小费吗?
我正在开发一个使用第三方jar的Android应用程序.我想监视并可能修改该库发出的HTTP请求.在iOS下,我可以通过注册一个自定义NSURLProtocol类来实现这一点,该类可以检查和操作应用程序进程中发生的任何网络请求.
Android有什么相似之处吗?我承认,我是Android开发的新手,但一直无法找到解决这个问题的工作方案.
我没有这个jar的来源,我不能依赖反编译它.
我探讨了几件事:
org.apache.http.impl.client.DefaultHTTPClient类.(这是用于我之后的请求的底层网络类.)似乎这不起作用,因为Android已经缓存了这个类的系统版本并且总是加载而不是我的,即使它设置得更高加载顺序.我看过了Apache的HTTP库相当不错,虽然它有各种各样的事情一样HttpRequestInterceptor,HttpResponseInterceptor阶级,这并不对我没啥用,因为库实例化一个DefaultHTTPClient实例,并将它的私有方法中分配给私有成员我没有权限.
我的最终目标是监控和更改这些单元测试请求.我不希望发出真实的请求; 我想提供模拟回复.
有人可以向我解释一下参考HttpComponents PoolingHttpClientConnectionManager的内容setMaxPerRoute(max)和 setMaxTotal(max)做法吗?
面对这个奇怪的问题,从早上开始,我正在对一个特定的端点进行REST调用,该端点在页面中给出响应,所以我需要一次又一次地调用,直到所有页面都完成.我的代码工作正常,花花公子直到最后一页之后的最后一页我下一个请求(应该返回一个空白页)httpClient.execute(httpGet);被永久阻止,永远不会回来或者都不会抛出任何异常.如果我设置连接请求超时,那么最后一次调用没有被阻止,并且没有说超时,但我没有理解为什么最后一次调用不起作用如果我从firefox RESTClient进行相同的最后一次调用它可以工作.请帮助.
我也尝试添加不同的日志级别System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog");和其他日志来调试,但没有运气.
以下是我的代码.
private static Servers fetchServers(String token,String endpoint) throws Exception{
JsonReader jreader = null;
InputStreamReader isr = null;
CloseableHttpClient httpClient = null;
try{
URI uri = new URI(endpoint);
/** accepting all certificates */
httpClient = getSecuredHttpClient();
uri = new URIBuilder(uri)
.setParameter("limit", "1")//Page limit, for testing have kept just 1 since i have only 2 records.
.build();
HttpGet httpGet = new HttpGet(uri);
httpGet.setHeader(HTTP.CONTENT_TYPE, "application/json");
httpGet.setHeader("X-Auth-Token", token);
httpGet.setHeader("accept", "application/json");
httpGet.setHeader(HTTP.USER_AGENT, "python-neutronclient");
Servers cloudServers …Run Code Online (Sandbox Code Playgroud) java apache rest apache-httpcomponents apache-httpclient-4.x
我们在同一个tomcat服务器上部署了三个应用程序A,B和C.在A到B之间发生了一个HTTP调用(REST CALL)和从B到C的另一个http调用(REST CALL)
我们最初使用同步HTTP调用,最近我们将代码更改为异步调用.我们使用HttpAsyncClients(应用程序A调用应用程序B)和(应用程序B调用应用程序C).
我们得到间歇性的org.apache.http.ConnectionClosedException:有时我们在应用程序A的日志(Async Client到B)和应用程序B中的某个时间(异步客户端到C)中获得此异常
CloseableHttpAsyncClient client = HttpAsyncClients.custom()
.setMaxConnPerRoute(100))
.setMaxConnTotal(config.getInt(150)).build();
Run Code Online (Sandbox Code Playgroud)
并且对于我们给予超时的每个请求
final RequestConfig params = RequestConfig.custom().setConnectTimeout(300000) // 5min
.setSocketTimeout(300000).setConnectionRequestTimeout(300000).build();
Run Code Online (Sandbox Code Playgroud)
请在下面找到堆栈跟踪:
org.apache.http.ConnectionClosedException: Connection closed
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.endOfInput(HttpAsyncRequestExecutor.java:344) [httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:261) [httpcore-nio-4.4.5.jar:na]
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81) [httpasyncclient-4.1.2.jar:na]
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39) [httpasyncclient-4.1.2.jar:na]
at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114) [httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162) [httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337) [httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315) [httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276) [httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) [httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588) [httpcore-nio-4.4.5.jar:4.4.5]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_60]
Run Code Online (Sandbox Code Playgroud)
请注意这个问题不是重复的 间歇性ConnectionClosedException与httpasynclient stacj跟踪是完全不同的.事件这个问题发生间歇性.
java ×6
apache ×2
android ×1
credentials ×1
digest ×1
header ×1
host ×1
http ×1
httpclient ×1
httprequest ×1
java-7 ×1
rest ×1
ssl ×1
timeout ×1
truststore ×1