我想在HttpClient连接中使用手机的默认用户代理,并想知道是否有办法获取用户代理而无需使用WebView进行查询.
背景
我一直在自己的Eclipse项目中使用Authorize.net SDK.一切都很好.然后我需要将它添加到我的主项目中.我将依赖项添加到类路径中,并将其复制到我需要的代码块中.它应该有效.
问题
长话短说,代码在我放置它的地方不起作用.但是,当我把它带到项目中的main方法时,它将起作用.
在它不起作用的地方我用调试器逐步完成代码并发现以下异常:
java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
Run Code Online (Sandbox Code Playgroud)
抛出:
HttpResponse httpResponse = httpClient.execute(httpPost);
Run Code Online (Sandbox Code Playgroud)
注意:来自Apache的httpClient = DefaultHttpClient
我现在完全被难倒了.不要导致此错误的原因.在Eclipse中,这两个产品似乎都针对相同的JRE.他们也都有httpclient-4.0.1.jar.请注意,有问题的项目还有一些其他依赖项,工作项目不会{boneCP,guava,mysql_connector_java,protobuf}
我不认为额外的罐子是原因,因为问题代码在项目的不同位置工作.
非常感谢任何有关错误的想法,我花了一天时间调试这个,不知道下一步该怎么做.
谢谢.
我想访问一个首先需要(tomcat服务器)身份验证的站点,然后使用POST请求登录并让该用户查看该站点的页面.我使用Httpclient 4.0.1
第一次身份验证工作正常但不是总是抱怨此错误的登录:"302暂时移动"
我保持饼干和我保持上下文,但没有.实际上,似乎登录工作,因为如果我写错了参数或用户||密码,我会看到登录页面.所以我猜不起作用的是自动重定向.
在我的代码之后,它始终抛出IOException,302:
DefaultHttpClient httpclient = new DefaultHttpClient();
CookieStore cookieStore = new BasicCookieStore();
httpclient.getParams().setParameter(
ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);
HttpContext context = new BasicHttpContext();
context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
//ResponseHandler<String> responseHandler = new BasicResponseHandler();
Credentials testsystemCreds = new UsernamePasswordCredentials(TESTSYSTEM_USER, TESTSYSTEM_PASS);
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
testsystemCreds);
HttpPost postRequest = new HttpPost(cms + "/login");
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("pUserId", user));
formparams.add(new BasicNameValuePair("pPassword", pass));
postRequest.setEntity(new UrlEncodedFormEntity(formparams, "UTF-8"));
HttpResponse response = httpclient.execute(postRequest, context);
System.out.println(response);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK)
throw new IOException(response.getStatusLine().toString());
HttpUriRequest currentReq = (HttpUriRequest) context.getAttribute( …Run Code Online (Sandbox Code Playgroud) 我想使用一个简单的HttpClient.
但是,看来sun.net.www.http.HttpClient是无法访问的.
此外,com.ibm.ws.http.HTTPConnection - 似乎更支持http服务器而不是客户端.为什么?因为当我创建一个HttpConnection实例时,它有一个我应该写的"getHttpResponse".
无论如何使用IBM HttpConnection for HttpClient?
或者,我可以使用任何标准的httpClient代码吗?
谢谢.
我正在使用HttpClient最新版本(4.x).而现在我正在尝试做一个GET请求.我刚刚发布了一个Get请求.
这是我的代码;
public class Poster {
static boolean routing1 = true, routing2 = true;
static int counter1 = 0, counter2 = 0;
DefaultHttpClient oHtp = null;
HttpGet oHGet = null;
HttpResponse oHRes = null;
private void test(String fullAddress) throws Exception {
oHtp = new DefaultHttpClient();
oHGet = new HttpGet(fullAddress);
HttpResponse response = oHtp.execute(oHGet);
System.out.print(response.getStatusLine());
HttpEntity entity = response.getEntity();
if (entity != null) {
entity = new BufferedHttpEntity(entity);
// System.out.println(EntityUtils.toString(entity));
System.out.print("\t entity is retrieved... ");
}
oHtp.getConnectionManager().shutdown();
}
}
Run Code Online (Sandbox Code Playgroud)
我只是很好地执行它.首先是
new …Run Code Online (Sandbox Code Playgroud) 我正在使用apache的常见httpclient库.是否可以通过代理发出HTTP请求?更具体地说,我需要使用代理列表来处理多线程POST请求(现在我正在使用单线程GET请求进行测试).
我试着用:
httpclient.getHostConfiguration().setProxy("67.177.104.230", 58720);
Run Code Online (Sandbox Code Playgroud)
我得到了该代码的错误:
21.03.2012. 20:49:17 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (java.net.ConnectException) caught when processing request: Connection refused: connect
21.03.2012. 20:49:17 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
21.03.2012. 20:49:19 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (java.net.ConnectException) caught when processing request: Connection refused: connect
21.03.2012. 20:49:19 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
21.03.2012. 20:49:21 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (java.net.ConnectException) caught when processing request: Connection refused: connect
21.03.2012. 20:49:21 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
org.apache.commons.httpclient.ProtocolException: The server xxxxx failed to respond with a …Run Code Online (Sandbox Code Playgroud) 好的,我最近切换到.NET framework 4.5并开始使用HttpClient而不是HttpWebRequest和Response.我真的很喜欢async/await风格,但我不知道如何在POST/GET请求后获取重定向的url.
使用HttpWebResponse,我可以使用.ResponseUri属性
HttpWebRequest request = (HttpWebRequest)WebRequest.Create ("http://www.google.com");
HttpWebResponse response = (HttpWebResponse)request.GetResponse ();
string responseURI = response.ResponseUri;
Run Code Online (Sandbox Code Playgroud)
花了我3个小时的搜索,我仍然无法完成它:(
我正在编写一个可以在网站上登录和购物的Java应用程序.当我尝试执行第二个HttpResponse/Post时,我遇到了HttpClient挂起的问题.它之前工作正常,不知道为什么它开始挂起.我没有得到任何错误,它只是坐在那里而陷入困境.我做的唯一一个可能导致这种挂断的变化是我正在使用HttpGet来检索令牌,所以我可以登录到该网站.
这是我如何设置httpClient
private static BasicCookieStore cookieStore = new BasicCookieStore();
private static HttpClient httpClient = HttpClientBuilder.create().setDefaultCookieStore(cookieStore).build();
Run Code Online (Sandbox Code Playgroud)
其余的只是一个标准的httpget&httppost,然后是httpclient.execute();
第一个序列是我的程序查询网站并检索令牌,然后我发送带有令牌的POST以登录.之后,我的程序再次查询网站以获取产品信息,然后添加到购物车.但它在第二次POST时挂起.
我可以在某个地方错过同花顺吗?我正在读某个地方,这种HttpClient关闭了.DefaultHttpClient已被弃用.
我在.NET上的HTTP请求有一个低性能问题.对localhost上的REST API的HTTP GET请求大约需要500毫秒才能完成.我花了很多时间来解决它.我曾尝试过很多办法:HttpClient,HttpWebRequest,WebClient和RestSharp.他们都没有工作.互联网上的大多数解决方案都说要设置Proxy参数,null但它仍然无法更快地运行.
我发现减少这个时间的唯一方法是将请求的Keep-Alive参数设置为false:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
request.KeepAlive = false;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Run Code Online (Sandbox Code Playgroud)
这非常有效.时间减少到7-10毫秒.但现在由于某些原因我需要使用HttpClient而不是HttpWebRequest.而且我找不到如何将Keep-Alive设置为false HttpClient.我发现的唯一一件事就是如何通过将"连接"标题设置为"保持活跃"来将其设置为true.
我在HttpClient上使用此代码进行POST请求:
HttpClient _http = new HttpClient();
_http.DefaultRequestHeaders.Accept.Clear();
_http.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
_http.DefaultRequestHeaders.Add("Keep-Alive", "timeout=600");
var content = new StringContent(
request, Encoding.UTF8, "application/%appname%+xml");
content.Headers.ContentType.Parameters.Add(
new NameValueHeaderValue("type", "payload"));
HttpResponseMessage response = await _http.PostAsync(uri, content);
Run Code Online (Sandbox Code Playgroud)
它仍然需要大约500-600毫秒才能完成.
当我尝试在Verizon的4G/LTE上使用我的应用程序时,我收到了一些崩溃用户的报告.
查看堆栈跟踪,看起来Android的HttpClient.execute()实现正在抛出一个OOM.这仅发生在4G/LTE设备上,特别是HTC Thunderbolt,并且仅在4G/LTE上.WiFi,3G,UMTS都可以.也适用于Sprint的WiMax 4G工作正常.
两个问题:
什么是引起Android开发者注意的最佳方式?除了在http://code.google.com/p/android/issues上报告之外,还有哪些更好的选择?
关于如何解决这个问题的任何想法?我自己没有4G设备,我无法在模拟器中实现这一点,所以我需要在这里做一些有根据的猜测.我可以尝试在我的代码中捕获OOM并尝试清理并强制GC,但我不确定这是不是一个好主意.评论或其他建议?
这是我的代码正在做的事情:
HttpParams params = this.getHttpParams(); // returns params
ClientConnectionManager cm = new ThreadSafeClientConnManager(params, this.getHttpSchemeRegistry() );
DefaultHttpClient httpClient = new DefaultHttpClient( cm, params );
HttpResponse response = null;
request = new HttpGet( url );
try {
response = httpClient.execute(request); // <-- OOM on 4G/LTE. OK otherwise
int statusCode = response.getStatusLine().getStatusCode();
Log.i("fetcher", "execute returned, http status " + statusCode );
...
Run Code Online (Sandbox Code Playgroud)
这是崩溃的堆栈跟踪:
E/dalvikvm-heap(11639):2055696字节分配的内存不足.I/dalvikvm(11639):"Thread-16"prio = 5 tid = 9 RUNNABLE I/dalvikvm(11639):| group ="main"sCount = …