我试图使用Apache commons httpclient登录到https安全站点.
因为我在HttpClient Package中找不到任何这样的类,所以我没有办法将证书与我的httprequest一起传递.
如果有人可以指导我在哪里需要添加证书处理?
任何套餐都可以吗?
我愿意接受各种想法,以及在java中执行此操作的任何其他方式.平台必须只是java但是..
我在下面发布了我的代码.
import java.net.MalformedURLException;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.cookie.CookieSpec;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
public class TestHttpClient {
public static String formPostUrl ="https://login.findmespot.com/faces/welcome.jsp" ;
public static String LOGON_SITE = "login.findmespot.com";
static final int LOGON_PORT = 443;
public static void main(String[] args ) throws MalformedURLException
{
// AuthSSLProtocolSocketFactory ar= new AuthSSLProtocolSocketFactory(uRL, formPostUrl, uRL0, formPostUrl)
//Protocol authhttps = new Protocol("https", new AuthSSLProtocolSocketFactory(new URL("D:\key\my.keystore"), "4cKR!Z%p",new URL("D:\key\my.truststore"), "4cKR!Z%p"), 443); …Run Code Online (Sandbox Code Playgroud) 我想做格式的HTTP POST,如下所示,
<?xml version="1.0" encoding="UTF-8" ?>
<authRequest>
<username>someusernamehere</username>
<password>somepasswordhere</password>
</authRequest>
Run Code Online (Sandbox Code Playgroud)
对于任何基于登录的POST,我通常使用以下机制,
HttpParams params = new BasicHttpParams();
params.setParameter(
"http.useragent",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2) Gecko/20100115 Firefox/3.6");
DefaultHttpClient httpclient = new DefaultHttpClient(params);
HttpPost httppost = new HttpPost("http://mysite.com/login");
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("username", "stackoverflow"));
formparams.add(new BasicNameValuePair("password", "12345"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
httppost.setEntity(entity);
HttpResponse httpresponse = httpclient.execute(httppost);
Run Code Online (Sandbox Code Playgroud)
但是通过这种方式,POST数据看起来像,
username=stackoverflow&password=12345
Run Code Online (Sandbox Code Playgroud)
如何根据我上面提到的指定XML格式格式化此请求?
提前致谢.
对于某些我们无法解决的问题,我想在Apache HttpClient 3.1上禁用保持活动状态。但是,我在Internet上找不到任何资源。你知道怎么做吗?
我正在尝试使用Java在网站上自动执行某些任务.我有一个有效的客户端为该网站(当我使用Firefox登录时工作),但当我尝试使用http客户端登录时,我一直收到403错误.请注意,我希望我的信任商店信任任何东西(我知道它不安全,但此时我并不担心).
这是我的代码:
KeyStore keystore = getKeyStore();//Implemented somewhere else and working ok
String password = "changeme";
SSLContext context = SSLContext.getInstance("SSL");
KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmfactory.init(keystore, password.toCharArray());
context.init(kmfactory.getKeyManagers(), new TrustManager[] { new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] arg0, String arg1)
throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] arg0, String arg1)
throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
} }, new SecureRandom());
SSLSocketFactory sf = new SSLSocketFactory(context);
Scheme httpsScheme = new Scheme("https", 443, sf);
SchemeRegistry schemeRegistry …Run Code Online (Sandbox Code Playgroud) 如何在新的Apache Http Client 4.3中创建SSL套接字工厂?
这是我在4.3之前创建它的方式
val ts = new TrustStrategy() {
def isTrusted(chain: Array[X509Certificate], authType: String): Boolean = true
}
new SSLSocketFactory(ts, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
Run Code Online (Sandbox Code Playgroud)
现在SSLSocketFactory标记为已弃用.定义自定义的新方法是TrustStrategy什么?我无法理解.
有人可以分享如何配置现代HttpClient 4.5.3重试失败的请求并等待一段时间再重试之前?
到目前为止,我看起来正确,.setRetryHandler(new DefaultHttpRequestRetryHandler(X, false))它将允许重试X次请求.
但我无法理解如何配置退避:.setConnectionBackoffStrategy()/ .setBackoffManager()根据JavaDocs调节其他内容,而不是重试之间的超时.
我正在使用 Apache Http Client 4.5.3,目前正在重构一些代码。
目前我有一个单例 Util,它有几个方法,它们的职责是使用 get、posts、patch 等来访问 API。以前,我们一直使用 anHttpClientBuilder为CloseableHttpClient每个方法的每次调用构造一个对象。粗略地说,单例的架构是这样的:
import com.google.gson.Gson
import org.apache.http.client.methods.{HttpGet, HttpPost}
import org.apache.http.entity.StringEntity
import org.apache.http.impl.client.{CloseableHttpClient, HttpClientBuilder}
import org.apache.http.util.EntityUtils
import org.json4s.DefaultFormats
import org.json4s.jackson.JsonMethods.parse
object ApiCallerUtil {
case class StoreableObj(name:String, id:Long)
case class ResponseKey(key:Long)
def getKeyCall(param:String): ResponseKey = {
implicit val formats = DefaultFormats
val get = new HttpGet("http://wwww.someUrl.com/api/?value=" + param)
val client:CloseableHttpClient = HttpClientBuilder.create().build()
val response = client.execute(get)
try {
val entity = response.getEntity
val entityStr = EntityUtils.toString(entity)
parse(entityStr).extract[ResponseKey]
} finally { …Run Code Online (Sandbox Code Playgroud) 我尝试使用 Apache Http 库上传多个文件。
compile group: 'org.apache.httpcomponents', name: 'httpmime', version: '4.5.6'
Run Code Online (Sandbox Code Playgroud)
这就是我上传文件的方式。
String url = "url";
File f1 = new File("file1");
File f2 = new File("file2");
HttpPost request = new HttpPost(url);
request.addHeader("Content-Type", "multipart/form-data");
request.addHeader("Authorization", "Basic abcd=");
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
FileBody fileBody1 = new FileBody(f1, ContentType.DEFAULT_TEXT);
FileBody fileBody2 = new FileBody(f2, ContentType.DEFAULT_TEXT);
multipartEntityBuilder.addPart("file_1_param", fileBody1);
multipartEntityBuilder.addPart("file_2_param", fileBody2);
HttpEntity httpEntity = multipartEntityBuilder.build();
request.setEntity(httpEntity);
HttpClient httpClient = HttpClients.createDefault();
HttpResponse response = httpClient.execute(request);
HttpEntity entity = response.getEntity();
if (entity == null) {
return; …Run Code Online (Sandbox Code Playgroud) 使用 Apache HttpClient 版本时:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
setHeader 和 addHeader 有什么区别?
httpPost.addHeader("AuthenticationKey",authenticationKey);
httpPost.addHeader("Content-Type","application/json");
httpPost.setHeader("Cache-Control", "no-cache"); // HTTP 1.1
httpPost.setHeader("Pragma", "no-cache"); // HTTP 1.0
httpPost.setHeader("X-Requested-With", "XMLHttpRequest"); // mimics a browser REST request
Run Code Online (Sandbox Code Playgroud) 我正在访问 Tomcat 8.5 Web 服务器的 Java“客户端”中运行性能测试。大约 13,000 个请求 HTTP 请求失败并出现错误后,
org.apache.http.impl.client.DefaultHttpClient tryConnect
INFO: Retrying connect
java.net.BindException: Address already in use: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:127)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:643)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
Run Code Online (Sandbox Code Playgroud)
代码是,
for (int i = 0; i < 15000; i++) {
try {
if (i % 1000 == 0) …Run Code Online (Sandbox Code Playgroud) java ×8
ssl ×2
apache ×1
certificate ×1
file-upload ×1
http ×1
http-post ×1
httpclient ×1
keep-alive ×1
scala ×1