标签: apache-httpcomponents

Apache HTTP中的代理链接

有点混淆这里实际可能的东西.

Java Apache HTTP Client(4.x)链代理可以吗?关于如何提示?

我发现文档表明它可以,但源代码有点复杂,我发现至少有一个类(DefaultRequestDirector)抛出异常;

    throw new HttpException("Proxy chains are not supported.")
Run Code Online (Sandbox Code Playgroud)

使用单个代理配置客户端是直接的

    httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
Run Code Online (Sandbox Code Playgroud)

但对我来说,如何设置代理链并不明显.如果我按照上面文档中的提示操作,请执行以下操作.

    httpClient.setRoutePlanner(new HttpRoutePlanner() {
        @Override
        public HttpRoute determineRoute(HttpHost target, HttpRequest request, HttpContext context) throws HttpException {
            return new HttpRoute(target, null, new HttpHost[]{proxy, new HttpHost("localhost", 8081)}, "https".equalsIgnoreCase(target.getSchemeName()), TunnelType.TUNNELLED, LayerType.PLAIN);
        }
    });
Run Code Online (Sandbox Code Playgroud)

但这会导致上述异常;

org.apache.http.client.ClientProtocolException
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:822)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
    at Main.main(Main.java:70)
Caused by: org.apache.http.HttpException: Proxy chains are not supported.
    at org.apache.http.impl.client.DefaultRequestDirector.createTunnelToProxy(DefaultRequestDirector.java:957)
    at org.apache.http.impl.client.DefaultRequestDirector.establishRoute(DefaultRequestDirector.java:764)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:579)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    ... 8 …
Run Code Online (Sandbox Code Playgroud)

java apache-httpcomponents

5
推荐指数
1
解决办法
1331
查看次数

使用Apache HTTP Components进行HTTP身份验证:强制发送质询

我需要与一个需要身份验证的模糊网络服务器交谈.如果我不提供凭据,则会显示登录表单.但是,如果我提供未经请求的基本身份验证凭据,我会直接获得所需的内容.

wget 直接支持这个:

# this fails and downloads a form:
wget https://weird.egg/data.txt --http-user=me --http-password=shhh

# this works and downloads the document:
wget https://weird.egg/data.txt --http-user=me --http-password=shhh --auth-no-challenge
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:如何使用Apache的HTTP组件在Java中进行下载?

这是我到目前为止所得到的.(还有到位的代理,我用-Y onwget,我有一个匹配的https_proxy环境变量.)

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import java.net.URI;

// ...

DefaultHttpClient hc = new DefaultHttpClient();
hc.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(proxy_name, proxy_port));

URI uri = new URI("https://weird.egg/data.txt");

hc..getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthScope.ANY_SCHEME), new UsernamePasswordCredentials("me", "shh"));

hc.execute(new HttpGet(uri)); // etc
Run Code Online (Sandbox Code Playgroud)

但是,我最终只得到登录表单页面,而不是实际文档.我怀疑DefaultHttpClient没有像这样发送未经请求的凭证wget.有没有办法让Java程序发送凭据?

java http-authentication apache-httpcomponents

5
推荐指数
1
解决办法
4936
查看次数

HttpGet.abort()/ HttpPost.abort()并不总是立即中止

我正在使用Apache HttpComponents 4.2.1,并且无法使HttpGet.abort()和HttpPost.abort()总是立即中止。它在大多数时间都有效,但是有时连接会阻塞直到超时。我注意到只有在我明确设置超时值时才会发生这种情况。

这是我的测试代码:

public static void main(String[] args) throws Exception {
    for (int i = 0; i < 10; i++) {
        testAbort();
    }
}

public static void testAbort() throws Exception {
    String urlString = "http://slow.website.com";

    final HttpGet httpGet = new HttpGet(urlString);

    Runnable runnable = new Runnable() {
        public void run() {
            try {
                HttpClient httpClient = new DefaultHttpClient();

                HttpParams httpParams = httpClient.getParams();

                HttpConnectionParams.setConnectionTimeout(httpParams, 10000); // issue doesn't occur if I comment this line

                httpClient.execute(httpGet);
            } 
            catch (Exception e) { …
Run Code Online (Sandbox Code Playgroud)

java apache-httpcomponents

5
推荐指数
0
解决办法
2182
查看次数

HttpComponents自定义SSLSocketFactory

根据http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientCustomSSL.java上的示例

SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
Run Code Online (Sandbox Code Playgroud)

应该使用我的自定义信任库来实例化SSLSocketFactory,但是当我尝试构建我的项目时,我得到了错误

javax.net.ssl.SSLSocketFactory is abstract; cannot be intantiated
Run Code Online (Sandbox Code Playgroud)

这个例子过时了吗?它适用于其他人吗?

ssl keystore apache-httpcomponents

5
推荐指数
1
解决办法
6606
查看次数

httpcomponents 的 ssl 连接导致 socket 关闭

我正在尝试从网络服务器获取一些数据,这些数据与 http 配合良好。

但是当我尝试 https(ssl connection) 时,我得到如下异常。

我得到了正确的 http 状态代码 200 和响应内容长度 2230。

        java.net.SocketException: Socket is closed
            at sun.security.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1483)
            at sun.security.ssl.AppInputStream.read(AppInputStream.java:92)
            at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
            at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)
            at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:183)
            at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:144)
            at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:121)
Run Code Online (Sandbox Code Playgroud)

我的代码如下,带有 apache httpcomponents httpclient(4.2.5) 库。

        try {
            HttpPost httppost = new HttpPost(uri);
            HttpHost targetHost = new HttpHost(HOST_NAME, HOST_PORT, PROTOCOL);

            InputStreamEntity reqEntity = new InputStreamEntity(new ByteArrayInputStream(request), -1);
            String contentType = TSPConstants.CONST_TSA_CONTENT_TYPE_TSREQUEST;
            reqEntity.setContentType(contentType);
            reqEntity.setChunked(true);
            // It may be more appropriate to use FileEntity class in this particular
            // instance but we …
Run Code Online (Sandbox Code Playgroud)

ssl apache-httpcomponents apache-httpclient-4.x

5
推荐指数
1
解决办法
1596
查看次数

如何使用Apache HttpComponentst创建和发布多部分/混合http请求?

我正在使用Apache HttpComponents v4.3.3(maven httpclient和httpmime).我需要上传一个包含一些元数据的文件.curl命令可以工作,如下所示.

curl -k -i -H"Content-Type:multipart/mixed"-X POST --form'field1 = val1'-form'field2 = val2'-form'file =@somefile.zip; type = application /拉链" 的https://www.some.domain/

我试过模仿这个卷曲的帖子,如下所示.

HttpEntity entity = MultiPartEntityBuilder
 .create()
 .addPart("field1",new StringBody("val1",ContentType.TEXT_PLAIN))
 .addPart("field2",new StringBody("val2",ContentType.TEXT_PLAIN))
 .addPart("file", new FileBody(new File("somefile.zip"), ContentType.create("application/zip"))
 .build();
HttpPost post = new HttpPost("https://www.some.domain");
post.addHeader("Content-Type", "multipart/mixed");
Run Code Online (Sandbox Code Playgroud)

但是,在我使用HttpClient执行HttpPost之后,我得到以下异常(服务器代码也是在Jetty上运行的Java).

org.apache.commons.fileupload.FileUploadException:请求被拒绝,因为没有找到多部分边界

当我添加一个曲线卷曲

curl --trace - -k -i -H"Content-Type:multipart/mixed"-X POST --form'field1 = val1'-form'field2 = val2'-form'file =@somefile.zip; type = application/zip'https://www.some.domain/

我看到表单字段/值对被设置为HTTP标头.

内容处理:表格数据; 名称=字段1 ...值1

我在这里做错了什么?任何帮助表示赞赏.

java curl http-post apache-httpcomponents

5
推荐指数
1
解决办法
8116
查看次数

将 HttpClients HTTP 版本更改为 HTTP/1.0

我正在尝试将 HTTP/1.0 与 Apache HttpClient 4.3 一起使用,但我不知道如何使用。在 3.x 版本中,它是这样完成的:

httpClient.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_0);
Run Code Online (Sandbox Code Playgroud)

现在已经弃用了。现在怎么办?谢谢你。

apache-httpcomponents apache-httpclient-4.x

5
推荐指数
1
解决办法
5691
查看次数

Web服务器使用的推荐Set-Cookie版本(0、1或2)

使用Apache HTTP组件作为客户端与在Tomcat服务器上运行的Web应用程序通信时,我在cookie管理方面遇到了一些问题。长话短说,我发现这是由于使用版本0的Set-Cookie标头导致的,默认情况下,这会导致HTTP组件使用不同的逻辑流并忽略没有域后缀的主机地址。尽管我可以通过更改cookie策略轻松解决此问题,但总体上我对cookie版本感到好奇。我似乎找不到太多有关这些天Web服务器默认应使用哪个版本的信息。出于兼容性考虑,Tomcat似乎默认为版本0。我不应该将其配置为使用版本1或2,还是有理由退出该版本?我不确定是否有任何安全性/兼容性/功能方面的隐患,还是根本就没有太大关系。我想它正在使用版本0与旧的浏览器兼容,我们还是不支持旧的浏览器。

tomcat http web apache-httpcomponents

5
推荐指数
1
解决办法
3160
查看次数

将哪些 Java 属性传递给 Java 应用程序以使用 http 代理进行身份验证

我有一个 Java 应用程序正在尝试通过 http 代理访问 Web 服务。Java 应用程序是第三方应用程序,我们无法访问其源代码。

可以通过传递 Java 启动参数等来配置其启动。我想知道可以传递哪些 java 属性,以便应用程序可以使用登录用户的 NTLM 凭据来验证代理连接?

当我将 https.proxyHost 和 https.proxyPort (即 -Dhttps.proxyHost=abcd ... 传递给 jvm 命令行)时,我确实看到日志中存在差异。现在失败并显示以下消息。

[WrapperSimpleAppMain] [AuthChallengeProcessor] ntlm authentication scheme selected 
INFO   | jvm 5    | 2015/06/03 14:49:25 | 2015-06-03 14:49:25,380 
INFO [WrapperSimpleAppMain] [HttpMethodDirector] No credentials available for NTLM <any realm>@proxy.ins.dell.com:80 
INFO  | jvm 5    | 2015/06/03 14:49:25 | Exiting due to fatal exception. 
INFO   | jvm 5    | 2015/06/03 14:49:25 | com.atlassian.bamboo.agent.bootstrap.RemoteAgentHttpException: HTTP status code 407 received in response …
Run Code Online (Sandbox Code Playgroud)

java bamboo http-proxy apache-httpcomponents apache-httpclient-4.x

5
推荐指数
1
解决办法
7641
查看次数

Java 程序中 SSLKEYLOGFILE 的等价物是什么?

SSLKEYLOGFILE 在哪里定义?

如上所述,SSLKEYLOGFILE 可以与某些程序一起使用来捕获按键日志。

但使用 TLS 的 Java 程序不尊重此环境变量。让这样的Java程序转储按键日志的正确方法是什么?(我认为Java程序很可能使用以下包进行TLS。但我不完全确定。)

https://hc.apache.org/httpcomponents-core-4.4.x/current/httpcore/apidocs/org/apache/http/ssl/package-summary.html

java ssl https apache-httpcomponents

5
推荐指数
2
解决办法
2378
查看次数