Tag: apache httpclient 4.x

Android:下载HTML并不总是有效

在我的应用程序中,我使用以下代码下载网站的HTML样式表: private DefaultHttpClient createHttpClient() { HttpParams my_httpParams = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(my_httpParams, 3000); SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme(“http”, PlainSocketFactory.getSocketFactory(), 80)); ThreadSafeClientConnManager multiThreadedConnectionManager = new ThreadSafeClientConnManager(my_httpParams, registry); DefaultHttpClient httpclient = new DefaultHttpClient(multiThreadedConnectionManager, my_httpParams); return httpclient; } private class Example extends AsyncTask { int mStatusCode = 0; String content = “”; @Override protected Void doInBackground(Void… args) […]

如何使用Google Drive REST AP和HTTPClient创建文件夹?

我正在使用带有HTTPClient的Google Drive REST API来创建文件夹。 REST API是这里的文档请注意REST AP请求执行 – 但使用了错误的数据:tt创建一个名为“untitled”的新文件并将我的json放在那里。 我已经尝试了使用HTTPClient构建POST请求的不同方法,这些方法成功执行 – 但不知何故,Google Drive响应创建文件并返回此数据并忽略我提交的POST数据。 这就是服务器所响应的内容 .. “kind”:“drive#file”,“id”:“0B-fYJN-c4UDjUlh1TUZadF9vejA”,这是一个有效的ID“title”:“Untitled”,—-错误的标题“mimeType”:“application / json; charset = UTF-8“, – 这是错误的mimeType .. 我尝试了以下调用API的方法:我不确定我发送的数据发生了什么。 1)使用表单名称值对 DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost postRequest = new HttpPost(“https://www.googleapis.com/upload/drive/v2/files?key=”+GoogleClientConstants.GOOGLE_api_key); postRequest.addHeader(“Authorization”, “Bearer ” + accessToken); postRequest.addHeader(“Content-Type”, “application/json; charset=UTF-8”); List nvps = new ArrayList (); nvps.add(new BasicNameValuePair(“title”, “vip”)); nvps.add(new BasicNameValuePair(“mimeType”, […]

HTTPClient – 捕获所有重定向的列表

是否可以使用HttpClient从URL捕获完整的重定向历史记录? 比方说,我们有URL-A重定向到URL-B,它最终将我们发送到URL-C,有没有办法捕获A,B和C的URL? 最明显的选择是在标题中手动查找位置标记,并在到达HTTP 200时停止。这不是一个简单的过程,因为我们需要查找循环重定向等等… 现在我假设的东西是这样的: HttpContext context = new BasicHttpContext(); HttpResponse response = hc.execute(httpget, context); //….. for(URI u : ((RedirectLocations)context.getAttribute(DefaultRedirectStrategy.REDIRECT_LOCATIONS)).getAll()){ System.out.println(u); } 将适用于此用例?

HTTPSURLconnection和Apache(系统)DefaultHttpClient之间的证书链不同

我面临着一个奇怪的问题,即Apache HTTPS客户端。 我正在尝试连接到已启用基本身份validation的外部HTTPS网站(仅限SSL服务器身份validation)。 以下是我的测试和结论的摘要。 使用Chrome / Firefox / IE中的任何一个连接到网站 – >成功 使用javax.net.ssl.HttpsURLConnection – >成功 使用DefaultHttpClient或SystemDefaultHttpClient – >失败 我尝试通过启用“javax.net.debug”到“ssl”进行调试。 我注意到两个客户端都选择了相同的信任存储(默认的JDK信任存储)并使用相同的协议(TLSv1)。 然而,差异在这里 我注意到JDK返回了以下扩展名 扩展server_name,server_name:[host_name:websitehostname] 而Apache Web客户端调试日志中缺少上述扩展名。 另外,我看到的另一个区别是在证书链中 以下来自JDK native的回复 *证书链[0] = [[版本:V3主题:** CN = websitename ,OU =域控制validation – RapidSSL(R),OU =参见www.rapidssl.com/resources/cps(c)13,OU = GT17702541,SERIALNUMBER = Q2La1fpFlFdNy4kUCIehYlMvw6bq64Ch签名算法:SHA1withRSA,OID = 1.2.840.113549.1.1.5 而在apache客户端以下 chain [0] = [[版本:V3主题:EMAILADDRESS = root @ i4319, CN = […]

如何使用HttpComponents发布数组参数

我想用Apache http-components(4.1.2)执行此命令 curl –data “strings[]=testOne&string-keys[]=test.one&strings[]=testTwo&string-keys[]=test.two&project=Test” https://api.foo.com/1/string/input-bulk 目标api需要字符串和字符串键参数作为数组 ,这意味着为每个参数重复字符串[]和字符串键[] 。 这个curl命令工作正常,但是使用Http组件,而我得到了完全相同的参数。 也许我做错了什么。 List params = new ArrayList(); params.add( new BasicNameValuePair( “project”, PROJECT_NAME ) ); for ( Entry entry : newEntries ) { params.add( new BasicNameValuePair( “string-keys[]”, entry.getKey() ) ); params.add( new BasicNameValuePair( “strings[]”, entry.getValue() ) ); params.add( new BasicNameValuePair( “context[]”, “” ) ); } URI uri […]

配置Apache HttpClient通过代理/负载均衡器访问服务(覆盖主机头)

我在使用Apache HttpClient连接到虚拟化开发环境外部的服务时遇到问题。 要访问互联网(例如api.twitter.com),我需要调用本地URL(例如api.twitter.com.dev.mycompany.net),然后将请求转发给真正的主机。 问题是,对于我发送的任何请求,我得到404 Not Found响应。 我尝试使用wget对其进行调试,问题是,目标服务器通过使用请求URL和Host头中的主机名来识别所需的资源。 由于主机名不匹配,因此无法找到资源。 我(尝试通过)在客户端上设置http.virtual-host参数来尝试覆盖Host头,但是没有成功: HttpClient client = new DefaultHttpClient(); if (envType.isWithProxy()) { client.getParams().setParameter(ClientPNames.VIRTUAL_HOST, “api.twitter.com”); } 技术细节: 客户端在RESTeasy中用作执行程序来调用REST API。 因此,“手动”设置虚拟主机(如此处所述)不是一种选择。 一切都通过HTTPS / SSL完成 – 而不是我认为它有所作为。 编辑1:使用HttpHost而不是String也没有所需的效果: HttpClient client = new DefaultHttpClient(); if (envType.isWithProxy()) { HttpHost realHost = new HttpHost(“api.twitter.com”, port, scheme); client.getParams().setParameter(ClientPNames.VIRTUAL_HOST, realHost); } 编辑2:进一步调查显示,需要在请求对象上设置参数。 以下是设置虚拟主机的HttpClient的代码v.4.2-aplha1: HttpRequest orig = request; RequestWrapper […]

如何将curl -X post翻译成java

我试图将curl命令转换为Java(使用Apache HttpClient 4.x): export APPLICATION_ID=SOME_ID export REST_API_KEY=SOME_KEY curl -i -X POST \ -H “X-Parse-Application-Id: ${APPLICATION_ID}” \ -H “X-Parse-REST-API-Key: ${REST_API_KEY}” \ -H “Content-Type: image/png” \ –data-binary @/Users/thomas/Desktop/greep-small.png \ https://api.parse.com/1/files/greep.png 但是我收到以下错误:{“error”:“unauthorized”}。 这就是我的java代码: DefaultHttpClient httpclient = new DefaultHttpClient(); HttpHost targetHost = new HttpHost(“localhost”, 80, “http”); httpclient.getCredentialsProvider().setCredentials( new AuthScope(targetHost.getHostName(), targetHost.getPort()), new UsernamePasswordCredentials(“username”, “password”)); HttpPost httpPost = new HttpPost(“https://api.parse.com/1/files/greep.png”); System.out.println(“executing […]

从Commons HttpClient迁移到HttpComponents Client

我想从Commons HttpClient(3.x)迁移到HttpComponents Client(4.x),但是如何处理重定向很困难。 代码在Commons HttpClient下正常工作,但在迁移到HttpComponents Client时中断。 一些链接会产生不良重定向,但当我将“http.protocol.handle-redirects”设置为“false”时,大量链接会完全停止工作。 Commons HttpClient 3.x: private static HttpClient httpClient = null; private static MultiThreadedHttpConnectionManager connectionManager = null; private static final long MAX_CONNECTION_IDLE_TIME = 60000; // milliseconds static { //HttpURLConnection.setFollowRedirects(true); CookieManager manager = new CookieManager(); manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); CookieHandler.setDefault(manager); connectionManager = new MultiThreadedHttpConnectionManager(); connectionManager.getParams().setDefaultMaxConnectionsPerHost(1000); // will need to set from properties file connectionManager.getParams().setMaxTotalConnections(1000); […]

如何在multithreading操作中使用HttpAsyncClient?

与此问题密切相关: 如何在multithreading操作中使用HttpClient? ,我想知道apache HttpAsyncClient是否是线程安全的,或者它是否也需要使用MultiThreadedHttpConnectionManager或ThreadSafeClientConnManager。 如果它确实需要这样的连接管理器,那么异步库中是否存在一个连接管理器? 我能够在异步库中找到PoolingClientAsyncConnectionManager,但我不确定这是否是我需要的。 或者,我正在考虑使用ThreadLocal为每个线程创建一个HttpAsyncClient对象。 请注意,与我前面提到的问题不同,我需要状态在会话中独立 ,即使多个会话到达同一个域。 如果在会话1中设置了cookie,则会话2中的cookie 不可见。出于这个原因,我还考虑为每个请求创建一个全新的HttpAsyncClient对象,尽管我觉得应该有更好的方法。 谢谢。

HttpClient 4.2,基本身份validation和AuthScope

我有一个应用程序连接到需要基本身份validation的站点。 这些站点在运行时提供,在编译时不知道。 我正在使用HttpClient 4.2。 我不确定下面的代码是否应该如何指定基本身份validation,但文档会建议它。 但是,我不知道在AuthScope的构造函数中传递什么。 我原以为null参数意味着所提供的凭据应该用于所有URL,但它会抛出NullPointerException ,所以显然我错了。 m_client = new DefaultHttpClient(); UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(m_userName, m_password); ((DefaultHttpClient)m_client).getCredentialsProvider().setCredentials(new AuthScope((HttpHost)null), credentials);