GVKun编程网logo

Apache HttpClient 4.3.5设置代理(http代理如何设置)

33

在这里,我们将给大家分享关于ApacheHttpClient4.3.5设置代理的知识,让您更了解http代理如何设置的本质,同时也会涉及到如何更有效地Android无法访问org.apache.htt

在这里,我们将给大家分享关于Apache HttpClient 4.3.5设置代理的知识,让您更了解http代理如何设置的本质,同时也会涉及到如何更有效地Android无法访问org.apache.http.client.HttpClient、Apache HttpClient (理解Http Client)、Apache HttpClient 4.1-代理设置、Apache HttpClient 4.1-代理身份验证的内容。

本文目录一览:

Apache HttpClient 4.3.5设置代理(http代理如何设置)

Apache HttpClient 4.3.5设置代理(http代理如何设置)

看来我可以在构造new时指定代理HttpClient

HttpHost proxy = new HttpHost("someproxy", 8080);DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);CloseableHttpClient httpclient = HttpClients.custom()    .setRoutePlanner(routePlanner)    .build();

取自http://hc.apache.org/httpcomponents-client-
ga/tutorial/html/connmgmt.html#d5e475

是否可以修改现有客户端的代理设置。

答案1

小编典典

您可以创建自己的HttpRoutePlanner实现,该实现将允许更改HttpHost。

public class DynamicProxyRoutePlanner implements HttpRoutePlanner {    private DefaultProxyRoutePlanner defaultProxyRoutePlanner = null;    public DynamicProxyRoutePlanner(HttpHost host){        defaultProxyRoutePlanner = new DefaultProxyRoutePlanner(host);    }    public void setProxy(HttpHost host){        defaultProxyRoutePlanner = new DefaultProxyRoutePlanner(host);    }    public HttpRoute determineRoute(HttpHost target, HttpRequest request, HttpContext context) {        return defaultProxyRoutePlanner.determineRoute(target,request,context);     }}

然后,您可以在代码中使用此DynamicProxyRoutePlanner

HttpHost proxy = new HttpHost("someproxy", 8080);DynamicProxyRoutePlanner routePlanner = new DynamicProxyRoutePlanner(proxy);CloseableHttpClient httpclient = HttpClients.custom()    .setRoutePlanner(routePlanner)    .build();//Any time change the proxy routePlanner.setProxy(new HttpHost("someNewProxy", 9090));

Android无法访问org.apache.http.client.HttpClient

Android无法访问org.apache.http.client.HttpClient

我正在使用android studio来创build一个应用程序,使得一个GET请求到服务器。 我的代码是这样的:

import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGetHC4; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; public class HTTPHelper { private String base; public HTTPHelper (String base) { this.base = base; } public String doGet (String path) { try { CloseableHttpClient client = HttpClientBuilder.create().build(); HttpGetHC4 get = new HttpGetHC4(path); CloseableHttpResponse response = client.execute(get); return ""; } catch (Exception e) { return null; } } }

可以肯定的是Android Studio标志着这一行

client.execute(get);

有一个错误:

如何使用PHP在URL中传递URL(作为GET参数)?

.htaccess重写可以仍然使用获取variables的漂亮的URL

在Windows任务计划程序中使用$ _GEtvariables的PHP脚本

Ruby获取方法将我的input截断为256个字符

403发送GET数据时出现禁止的错误

说“不能访问org.apache.http.client.HttpClient”

这是我的gradle文件:

apply plugin: ''com.android.application'' android { compileSdkVersion 23 buildToolsversion "23.0.0" defaultConfig { applicationId "principal.halloween" minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(''proguard-android.txt''),''proguard-rules.pro'' } } } dependencies { compile filetree(dir: ''libs'',include: [''*.jar'']) compile ''com.android.support:appcompat-v7:23.0.0'' compile ''com.pubnub:pubnub-android:3.7.5'' compile ''com.google.code.gson:gson:2.3.1'' compile group: ''org.apache.httpcomponents'',name: ''httpclient-android'',version: ''4.3.5.1'' compile ''org.apache.httpcomponents:httpclient:4.3.6'' }

Git fetch github:索引包失败

vbs如何从命令行命令得到结果

replace$ _GET,使其从命令行工作

Cleacase如何知道一个目录是一个视图?

使用GET参数时,Apache Redirect 301失败,例如?blah =

在Android SDK 23中

HttpClient被弃用,因为它推断,你可以迁移你的代码在HttpURLConnection

https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client

你可以使用这个,但不建议了

android { useLibrary ''org.apache.http.legacy'' }

对于HttpURLConnection

URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setRequestMethod("GET"); connection.setDoInput(true); connection.connect();

这是因为现在sdk 23中不支持HttpClient。 尝试在你的gradle中添加这个。

android { useLibrary ''org.apache.http.legacy'' }

如果这不起作用,只需下载HttpClient jar文件并添加到您的库。

如果仍然无法正常工作,则必须将您的compileSdkVersion降级到22或更低。

总结

以上是小编为你收集整理的Android无法访问org.apache.http.client.HttpClient全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Apache HttpClient (理解Http Client)

Apache HttpClient (理解Http Client)

The Apache HttpComponents™ project is responsible for creating and maintaining a toolset of low level Java components focused on HTTP and associated protocols. Include HttpClient, HttpCore, HttpAsyncClient three sub projects.

HttpClient

HTTP 协议(1.0 ,1.1)的实现,更多的是面向开发者使用的API,用于发起Http请求。请求的执行(excute()),拦截(interceptor),请求路由(route),请求代理(proxy),请求认证(发起Https验证,Oauth认证等), 请求结果的处理(ResponseHandler), 异常处理等基本操作封装和配置,同时允许使用者高度配置。

基本包含以下内容:

  • 怎么发起http 和 https 请求
  • 怎么通过代理发起请求
  • 怎么接收返回值
  • 怎么配置连接池,连接和执行线程的关系
  • 怎么设置cookie,和一些认证信息
  • 怎么配置长连接
  • 设置超时,以及为什么要设置超时

Tips: HttpClient实例是可以线程共享的。

就以Apache HttpClient 提供的config example 来看一下。

/**
 * This example demonstrates how to customize and configure the most common aspects
 * of HTTP request execution and connection management.
 */
public class ClientConfiguration {

    public final static void main(String[] args) throws Exception {

        // Use custom message parser / writer to customize the way HTTP
        // messages are parsed from and written out to the data stream.
        HttpMessageParserFactory<HttpResponse> responseParserFactory = new DefaultHttpResponseParserFactory() {

            @Override
            public HttpMessageParser<HttpResponse> create(
                SessionInputBuffer buffer, MessageConstraints constraints) {
                LineParser lineParser = new BasicLineParser() {

                    @Override
                    public Header parseHeader(final CharArrayBuffer buffer) {
                        try {
                            return super.parseHeader(buffer);
                        } catch (ParseException ex) {
                            return new BasicHeader(buffer.toString(), null);
                        }
                    }

                };
                return new DefaultHttpResponseParser(
                    buffer, lineParser, DefaultHttpResponseFactory.INSTANCE, constraints) {

                    @Override
                    protected boolean reject(final CharArrayBuffer line, int count) {
                        // try to ignore all garbage preceding a status line infinitely
                        return false;
                    }

                };
            }

        };
        HttpMessageWriterFactory<HttpRequest> requestWriterFactory = new DefaultHttpRequestWriterFactory();

        // Use a custom connection factory to customize the process of
        // initialization of outgoing HTTP connections. Beside standard connection
        // configuration parameters HTTP connection factory can define message
        // parser / writer routines to be employed by individual connections.
        HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connFactory = new ManagedHttpClientConnectionFactory(
                requestWriterFactory, responseParserFactory);

        // Client HTTP connection objects when fully initialized can be bound to
        // an arbitrary network socket. The process of network socket initialization,
        // its connection to a remote address and binding to a local one is controlled
        // by a connection socket factory.

        // SSL context for secure connections can be created either based on
        // system or application specific properties.
        SSLContext sslcontext = SSLContexts.createSystemDefault();

        // Create a registry of custom connection socket factories for supported
        // protocol schemes.
        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
            .register("http", PlainConnectionSocketFactory.INSTANCE)
            .register("https", new SSLConnectionSocketFactory(sslcontext))
            .build();

        // Use custom DNS resolver to override the system DNS resolution.
        DnsResolver dnsResolver = new SystemDefaultDnsResolver() {

            @Override
            public InetAddress[] resolve(final String host) throws UnknownHostException {
                if (host.equalsIgnoreCase("myhost")) {
                    return new InetAddress[] { InetAddress.getByAddress(new byte[] {127, 0, 0, 1}) };
                } else {
                    return super.resolve(host);
                }
            }

        };

        // Create a connection manager with custom configuration.
        PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(
                socketFactoryRegistry, connFactory, dnsResolver);

        // Create socket configuration
        SocketConfig socketConfig = SocketConfig.custom()
            .setTcpNoDelay(true)
            .build();
        // Configure the connection manager to use socket configuration either
        // by default or for a specific host.
        connManager.setDefaultSocketConfig(socketConfig);
        connManager.setSocketConfig(new HttpHost("somehost", 80), socketConfig);
        // Validate connections after 1 sec of inactivity
        connManager.setValidateAfterInactivity(1000);

        // Create message constraints
        MessageConstraints messageConstraints = MessageConstraints.custom()
            .setMaxHeaderCount(200)
            .setMaxLineLength(2000)
            .build();
        // Create connection configuration
        ConnectionConfig connectionConfig = ConnectionConfig.custom()
            .setMalformedInputAction(CodingErrorAction.IGNORE)
            .setUnmappableInputAction(CodingErrorAction.IGNORE)
            .setCharset(Consts.UTF_8)
            .setMessageConstraints(messageConstraints)
            .build();
        // Configure the connection manager to use connection configuration either
        // by default or for a specific host.
        connManager.setDefaultConnectionConfig(connectionConfig);
        connManager.setConnectionConfig(new HttpHost("somehost", 80), ConnectionConfig.DEFAULT);

        // Configure total max or per route limits for persistent connections
        // that can be kept in the pool or leased by the connection manager.
        connManager.setMaxTotal(100);
        connManager.setDefaultMaxPerRoute(10);
        connManager.setMaxPerRoute(new HttpRoute(new HttpHost("somehost", 80)), 20);

        // Use custom cookie store if necessary.
        CookieStore cookieStore = new BasicCookieStore();
        // Use custom credentials provider if necessary.
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        // Create global request configuration
        RequestConfig defaultRequestConfig = RequestConfig.custom()
            .setCookieSpec(CookieSpecs.DEFAULT)
            .setExpectContinueEnabled(true)
            .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))
            .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC))
            .build();

        // Create an HttpClient with the given custom dependencies and configuration.
        CloseableHttpClient httpclient = HttpClients.custom()
            .setConnectionManager(connManager)
            .setDefaultCookieStore(cookieStore)
            .setDefaultCredentialsProvider(credentialsProvider)
            .setProxy(new HttpHost("myproxy", 8080))
            .setDefaultRequestConfig(defaultRequestConfig)
            .build();

        try {
            HttpGet httpget = new HttpGet("http://httpbin.org/get");
            // Request configuration can be overridden at the request level.
            // They will take precedence over the one set at the client level.
            RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig)
                .setSocketTimeout(5000)
                .setConnectTimeout(5000)
                .setConnectionRequestTimeout(5000)
                .setProxy(new HttpHost("myotherproxy", 8080))
                .build();
            httpget.setConfig(requestConfig);

            // Execution context can be customized locally.
            HttpClientContext context = HttpClientContext.create();
            // Contextual attributes set the local context level will take
            // precedence over those set at the client level.
            context.setCookieStore(cookieStore);
            context.setCredentialsProvider(credentialsProvider);

            System.out.println("executing request " + httpget.getURI());
            CloseableHttpResponse response = httpclient.execute(httpget, context);
            try {
                System.out.println("----------------------------------------");
                System.out.println(response.getStatusLine());
                System.out.println(EntityUtils.toString(response.getEntity()));
                System.out.println("----------------------------------------");

                // Once the request has been executed the local context can
                // be used to examine updated state and various objects affected
                // by the request execution.

                // Last executed request
                context.getRequest();
                // Execution route
                context.getHttpRoute();
                // Target auth state
                context.getTargetAuthState();
                // Proxy auth state
                context.getTargetAuthState();
                // Cookie origin
                context.getCookieOrigin();
                // Cookie spec used
                context.getCookieSpec();
                // User security token
                context.getUserToken();

            } finally {
                response.close();
            }
        } finally {
            httpclient.close();
        }
    }

}


HttpConnection, Socket and Thread

HttpConnection, Http连接是复杂的,有状态的,非线程安全的对象,它需要恰当的管理以便正确地执行功 能。 “HTTP 连接”一次仅只能由一个执行线程来使用。 HttpClient 采用一个特殊实体来 管理访问 HTTP 连接,这被称为 HTTP 连接管理器,ClientConnectionManager接口就是代表。HTTP 连接管理器的目的是作为工厂创建新的 HTTP 连接,管理持久连接的生命周期和同步访问持久连接(确保同一时间仅有一个线程可以访问一个连接)。内部的 HTTP 连接管理器使用 OperatedClientConnection 实例,这个实例为真正的连接扮演了一个代理,来管理连接状态和控制I/O操作的执行。如果一个管理的连接被释放或者被使用者明确地关闭,潜在的连接就会从它的代理分离,退回到管理器中。 尽管“服务消费者”仍然保存一个代理实例的引用。它也不能执行任何I/O操作、有意或无意地改变真实连接的状态。

first : HttpConnection 由ClientConnectionManager 管理,确保同一时间仅有一个线程可以访问一个连接,

Socket(java.net.Socket), This class implements client sockets (also called just "sockets"). A socket is an endpoint for communication between two machines. The actual work of the socket is performed by an instance of the SocketImpl class. An application, by changing the socket factory that creates the socket implementation, can configure itself to create sockets appropriate to the local firewall.

second : 然后通过SocketFactory创建Socket来建立连接,Thread block until response return or timeout.

HttpClientContext clientContext = HttpClientContext.create();
PlainConnectionSocketFactory sf = PlainConnectionSocketFactory.getSocketFactory();
Socket socket = sf.createSocket(clientContext);
int timeout = 1000; //ms
HttpHost target = new HttpHost("localhost");
InetSocketAddress remoteAddress = new InetSocketAddress(
        InetAddress.getByAddress(new byte[] {127,0,0,1}), 80);
sf.connectSocket(timeout, socket, target, remoteAddress, null, clientContext);

###Conclusion 关于HttpClient 的详细内容你应该读这篇文章 Http Client,这里介绍了Spring RestTemplate 中使用HttpClient,以及为什么很多人喜欢使用HttpClient (因为它的高度可配置化)。

###Reference

  1. HttpClient4.5中文翻译
  2. Apache HttpClient Example

Apache HttpClient 4.1-代理设置

Apache HttpClient 4.1-代理设置

我正在尝试将一些参数发布到服务器,但是我需要设置代理。您可以帮助我对代码的“设置代理”部分进行排序吗?

HttpHost proxy = new HttpHost("xx.x.x.xx");

DefaultHttpClient httpclient = new DefaultHttpClient();

httpclient.getParams().setParameter("3128",proxy);


HttpPost httpost = new HttpPost(url);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();

nvps.add(new BasicNameValuePair("aranan",song));

httpost.setEntity(new UrlEncodedFormEntity(nvps,HTTP.UTF_8));

HttpResponse response = httpclient.execute(httpost);
HttpEntity entity = response.getEntity();
System.out.println("Request Handled?: " + response.getStatusLine());

in = entity.getContent();

httpclient.getConnectionManager().shutdown();

Apache HttpClient 4.1-代理身份验证

Apache HttpClient 4.1-代理身份验证

我一直在尝试使用Apaches
HttpComponent的httpclient时从配置的属性中配置用于代理身份验证的用户和密码,但是没有成功。我发现的所有示例都引用了不再可用的方法和类,例如HttpStatesetProxyCredentials

因此,谁能给我一个有关如何配置代理凭据的示例?

答案1

小编典典

对于Basic-Auth,它看起来像这样:

DefaultHttpClient httpclient = new DefaultHttpClient();httpclient.getCredentialsProvider().setCredentials(    new AuthScope("PROXY HOST", 8080),    new UsernamePasswordCredentials("username", "password"));HttpHost targetHost = new HttpHost("TARGET HOST", 443, "https");HttpHost proxy = new HttpHost("PROXY HOST", 8080);httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

开箱即用不支持AFAIK
NTLM。但是您也许可以使用NTCredentials过载来管理它DefaultProxyAuthenticationHandler

我们今天的关于Apache HttpClient 4.3.5设置代理http代理如何设置的分享就到这里,谢谢您的阅读,如果想了解更多关于Android无法访问org.apache.http.client.HttpClient、Apache HttpClient (理解Http Client)、Apache HttpClient 4.1-代理设置、Apache HttpClient 4.1-代理身份验证的相关信息,可以在本站进行搜索。

本文标签: