开发者

Apache HttpClient and custom ports

开发者 https://www.devze.com 2023-04-12 03:29 出处:网络
I\'m using the Apache HttpClient 4 and it works fine. The only thing that doesn\'t work is custom ports. It seems like the root directory is fetched and the port is ignored.

I'm using the Apache HttpClient 4 and it works fine. The only thing that doesn't work is custom ports. It seems like the root directory is fetched and the port is ignored.

HttpPost post = new HttpPost("http://myserver.com:50000");
HttpResponse response = httpClient.execute(post)开发者_如何学JAVA;

If no port is defined, http- and https-connections work well. The scheme registry is defined as follows:

final SchemeRegistry sr = new SchemeRegistry();

final Scheme http = new Scheme("http", 80,
      PlainSocketFactory.getSocketFactory());
sr.register(http);

final SSLContext sc = SSLContext.getInstance(SSLSocketFactory.TLS);
  sc.init(null, TRUST_MANAGER, new SecureRandom());
SSLContext.setDefault(sc);

final SSLSocketFactory sf = new SSLSocketFactory(sc,
      SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

final Scheme https = new Scheme("https", 443, sf);
  sr.register(https);

How can I define custom ports for a request?


One suggestion is to try using HttpPost(URI address) instead of the one with String parameter. You can explicitly set the port:

URI address = new URI("http", null, "my.domain.com", 50000, "/my_file", "id=10", "anchor") 
HttpPost post = new HttpPost(address);
HttpResponse response = httpClient.execute(post);

Can't guarantee this will work, but give it a try.


The problem was that the server does not understand HTTP 1.1 chunked transfers. I cached the data by using a ByteArrayEntity and all was ok.

So custom ports do work with the code mentioned above.


Another approach is to configure httpClient to use a custom SchemaPortResolver.

int port = 8888;
this.httpClient = HttpClients.custom()
        .setConnectionManager(connectionManager)
        .setConnectionManagerShared(true)
        .setDefaultCredentialsProvider(authenticator.authenticate(url,
                port, username, password))
        .setSchemePortResolver(new SchemePortResolver() {
            @Override
            public int resolve(HttpHost host) throws UnsupportedSchemeException {
                return port;
            }
        })
        .build();

This way, you avoid problems of using a String to construct a HttpPost and calling httpClient.execute(host, httpPost, handler, context), only finding your port is appended after the path, like: http://localhost/api:8080, which is wrong.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号