我正在使用Apache httpcomponents Java库获取一个网页.连接结果后,我得到的是一个返回an HttpEntity的方法getContent(),InputStream并且还有一个writeTo()写入OutputStream的方法.
我想将结果转换为String以提取信息.最优雅(和安全)的方法是什么?
一些可能的解决方
ByteArrayOutputStream然后使用String构造函数将这些字节转换为String这些都感觉有点难看.你会建议选择其中之一吗?
我有一些大文件可以下载Apache的Http组件,我希望能够在我的网络应用程序的管理控制台中向用户显示一些进度信息.使用此库监视正在进行的下载的正确方法是什么?我将创建一个单例来管理正在进行的下载,我需要的是一种检查开放连接并找出它们在任何给定时间的位置的方法.
我正在编写一个删除API的服务器的客户端代码.API规范要求发送数据.我正在使用HttpComponents v3.1库来编写客户端代码.使用HtpDelete类我找不到向它添加请求数据的方法.有办法吗?以下是代码段.
HttpDelete deleteReq = new HttpDelete(uriBuilder.toString());
List<NameValuePair> postParams = new ArrayList<NameValuePair>();
postParams.add(new BasicNameValuePair(RestConstants.POST_DATA_PARAM_NAME,
postData.toString()));
try {
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(postParams);
entity.setContentEncoding(HTTP.UTF_8);
//deleteReq.setEntity(entity); // There is no method setEntity()
deleteReq.setHeader(RestConstants.CONTENT_TYPE_HEADER, RestConstants.CONTENT_TYPE_HEADER_VAL);
} catch (UnsupportedEncodingException e) {
logger.error("UnsupportedEncodingException: " + e);
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我Gson library用来将对象转换为对象,Json反之亦然。我已jars将该库的复制到一个新文件夹中lib,并将其添加到我的项目中的构建路径中Eclipse IDE。
我有一个主类,在其中我将对象转换为Json,toJson()如下所示,并将其发送给servletusing Apache HttpClient's HttpPost()。
Gson gson= new Gson();
String json = gson.toJson(names);
Run Code Online (Sandbox Code Playgroud)
但是在执行以下代码时,我servlet无法将转换Json为Objectusing fromJson()。
Gson gson = new Gson();
Names names = gson.fromJson(s, Names.class);
Run Code Online (Sandbox Code Playgroud)
它引发以下异常:
java.lang.NoClassDefFoundError: com/google/gson/Gson
Run Code Online (Sandbox Code Playgroud)
知道为什么会这样吗?我应该将拷贝jars到WebContent/WEB-INF/lib文件夹中而不是将新文件夹复制到lib吗?
eclipse classpath gson apache-httpcomponents apache-httpclient-4.x
我是否需要像使用HttpClient一样关闭Apache HttpAsyncClient中的过期连接?
我正在尝试使用org.apache.http.entity.mime.MultipartEntityBuilder在multipart/form-data POST请求上模仿我的浏览器行为
我的浏览器只发送Content-Disposition,但没有Content-Type或Content-Transfer-Encoding Headers.我尝试使用MultipartEntityBuilder.addPart()和addTextBody(),但默认情况下都添加了这些Headers:
我想要的(我的Chrome浏览器的功能):
POST .../some.jsp HTTP/1.1
Host: ...
Connection: keep-alive
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary6tcnkxC7txvqE5Xl
------WebKitFormBoundary6tcnkxC7txvqE5Xl
Content-Disposition: form-data; name="merkmal"
5
Run Code Online (Sandbox Code Playgroud)
我从MultipartEntityBuilder得到了什么
POST.../some.jsp HTTP/1.1
Host: ...
Content-Type: multipart/form-data; boundary=m9Zb2QD-QaH-j-HqgGQfI8KwDkToz17ULYkZ
--m9Zb2QD-QaH-j-HqgGQfI8KwDkToz17ULYkZ
Content-Disposition: form-data; name="merkmal"
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
5
Run Code Online (Sandbox Code Playgroud)
为什么?:指定的服务器认为name ="merkmal"之后的所有内容都是merkmal(包括Headers)的值.其他可能的原因:整个请求可能有某种错误的编码(特别是换行)?
从版本4.3.6开始,Apache HttpClient中禁用了SSLv3 ,但我使用的是版本4.5.该开发者写道:
那些希望继续使用SSLv3的用户需要明确启用对它的支持.
我试图在JVM级别设置支持的协议,但它不起作用.示例是在Scala中,但这与问题无关:
System.setProperty("https.protocols", "SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2")
Run Code Online (Sandbox Code Playgroud)
我的第二次尝试是这样的:
val instance: CloseableHttpClient = {
val trustStrategy = new TrustStrategy {
override def isTrusted(x509Certificates: Array[X509Certificate], s: String) = true
}
val sslContext = new SSLContextBuilder().loadTrustMaterial(null, trustStrategy).build()
val sslSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE)
val socketFactoryRegistry =
RegistryBuilder.create[ConnectionSocketFactory]()
.register("http", PlainConnectionSocketFactory.getSocketFactory)
.register("https", sslSocketFactory)
.build()
val connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry)
HttpClients.custom()
.disableRedirectHandling()
.setSSLContext(sslContext)
.setConnectionManager(connectionManager)
.build()
}
Run Code Online (Sandbox Code Playgroud)
但它也没有用.
如何使用Apache HttpClient 4.5连接支持SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2的主机?
我正在使用org.apache.httpcomponents.httpclient发送带有cookie的http请求:
```
URI uri = new URIBuilder().setScheme("https").setHost("api.weibo.com").setPath("/oauth2/authorize").setParameter("client_id","3099336849").setParameter("redirect_uri","http://45.78.24.83/authorize").setParameter("response_type", "code").build();
HttpGet req1 = new HttpGet(uri);
RequestConfig config = RequestConfig.custom().setRedirectsEnabled(false).build();
req1.setConfig(config);
req1.setHeader("Connection", "keep-alive");
req1.setHeader("Cookie", cookie);
req1.setHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36");
response = httpclient.execute(req1);
Run Code Online (Sandbox Code Playgroud)
```
我在Google上搜索了很多,并尝试启用/禁用自动重定向,但是它似乎对我不起作用。
有没有办法在请求后使用 Apache HttpClient 获取经过身份验证的服务器的 SSL 证书 - 只是服务器端 request.getAttribute("javax.servlet.request.X509Certificate") 的对应项?
来自DropWizard我已经习惯了它的HttpClientConfiguration,我很困惑,在Spring Boot中,我找不到一些支持以类似的方式控制http客户端实例,例如RestTemplates.
要在生产中工作,底层客户端实现应该是高性能的(例如,非阻塞io,具有连接重用和池化).
然后我需要设置超时或身份验证,可能是度量收集,cookie设置,SSL证书设置.
以上所有内容都应该很容易设置为不同的实例,以便在不同的上下文中使用不同的实例(例如,对于服务X使用这些设置和此池,对于Y使用另一个池和设置),大多数参数应该通过环境设置 - 在生产/ qa /开发中具有不同值的特定属性.
有没有可以用于此目的的东西?
configuration spring apache-httpcomponents dropwizard spring-boot
java ×6
http ×3
classpath ×1
connection ×1
dropwizard ×1
eclipse ×1
gson ×1
http-delete ×1
httpclient ×1
https ×1
spring ×1
spring-boot ×1
ssl ×1