我有一些典型的代码使用HttpURLConnection来获取带有URL的文件.他们在android 1.x和2.x中运行良好.但在Android 4.1中失败了!
我在网上搜索但发现的信息很少.有人请帮忙调查这个问题吗?
private String mURLStr;
private HttpURLConnection mHttpConnection;
...
url = new URL(mURLStr);
...
mHttpConnection = (HttpURLConnection) url.openConnection();
mHttpConnection.setDoOutput(true);
mHttpConnection.setRequestMethod("GET");
...
InputStream is = mHttpConnection.getInputStream();
Run Code Online (Sandbox Code Playgroud)
getInputStream方法抛出异常:
08-01 15:56:48.856: W/System.err(13613): java.io.IOException: No authentication challenges found
08-01 15:56:48.856: W/System.err(13613): at libcore.net.http.HttpURLConnectionImpl.getAuthorizationCredentials(HttpURLConnectionImpl.java:427)
08-01 15:56:48.866: W/System.err(13613): at libcore.net.http.HttpURLConnectionImpl.processAuthHeader(HttpURLConnectionImpl.java:407)
08-01 15:56:48.866: W/System.err(13613): at libcore.net.http.HttpURLConnectionImpl.processResponseHeaders(HttpURLConnectionImpl.java:356)
08-01 15:56:48.866: W/System.err(13613): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
08-01 15:56:48.866: W/System.err(13613): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
...
Run Code Online (Sandbox Code Playgroud) 我已经看到了关于它应该如何与旧版本一起工作的答案,
DefaultHttpClient但是没有一个很好的例子HttpURLConnection
我正在使用HttpURLConnectionWeb应用程序发出请求.在我的Android应用程序开始时,我使用CookieHandler.setDefault(new CookieManager())自动处理会话cookie,这工作正常.
在登录后的某个时刻,我想用Web应用程序向用户显示实时页面WebView而不是在后台下载数据HttpURLConnection.但是,我想使用我之前建立的相同会话来防止用户再次登录.
如何复制饼干从java.net.CookieManager使用HttpURLConnection到android.webkit.CookieManager使用的WebView,所以我可以共享会话?
cookies android httpurlconnection single-sign-on android-webview
当我正在使用的库(路标1.1-SNAPSHOT)时,我似乎在Android 1.5上遇到了一个特殊的问题,它连续两次连接到远程服务器.第二个连接始终失败了HttpURLConnection.getResponseCode()的-1
这是一个暴露问题的测试用例:
// BROKEN
public void testDefaultOAuthConsumerAndroidBug() throws Exception {
for (int i = 0; i < 2; ++i) {
final HttpURLConnection c = (HttpURLConnection) new URL("https://api.tripit.com/oauth/request_token").openConnection();
final DefaultOAuthConsumer consumer = new DefaultOAuthConsumer(api_key, api_secret, SignatureMethod.HMAC_SHA1);
consumer.sign(c); // This line...
final InputStream is = c.getInputStream();
while( is.read() >= 0 ) ; // ... in combination with this line causes responseCode -1 for i==1 when using api.tripit.com but not mail.google.com
assertTrue(c.getResponseCode() > 0);
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,如果我签署请求然后使用整个输入流,则下一个请求将失败,结果代码为-1.如果我只是从输入流中读取一个字符,似乎不会发生故障.
请注意,任何网址都不会发生这种情况 - …
URLConnection缓存API的描述表示为最后一句:
Java 2 Standard Edition中没有URLConnection缓存的默认实现.但是,Java Plugin和Java WebStart确实提供了一个开箱即用的功能.
在哪里可以找到有关Webstart ResponseCache的更多信息?
使用以下(groovy)代码
def url = new URL('http://repo1.maven.org/maven2/')
def connection = url.openConnection()
def result = connection.inputStream.text
Run Code Online (Sandbox Code Playgroud)
我希望每次执行代码时都会联系服务器.但是在执行时
Java Web Start 10.9.2.05
JRE-Version verwenden 1.7.0_09-b05 Java HotSpot(TM) Client VM
Run Code Online (Sandbox Code Playgroud)
行为是不同的.第一次执行代码时,会联系服务器.所有后续的代码执行都不涉及与服务器的任何通信(使用wireshark跟踪).
但它变得更加奇怪.重新启动webstart应用程序后,第一次执行代码时,http://repo1.maven.org/maven2/.pack.gz请求url 导致a 404.仅请求原始网址导致a 304 NOT MODIFIED.所有后续执行都不涉及与服务器的任何通信.
我认为通过缓存功能透明地增强urlconnection的方法很好,很好,有助于提高客户端应用程序的性能.但由于本例中的服务器没有定义Expires头,也没有定义缓存控制头,我认为上面的代码应该总是询问服务器而不是默默地忽略我的请求.
以下代码在使用webstart 10.1.1.255执行时不起作用(这是由java 7的早期测试版安装的,但我不知道这是哪一个)
URL url = new URL("http://repo1.maven.org/maven2/");
URLConnection connection = url.openConnection();
connection.setRequestProperty("Accept-Encoding", "gzip");
connection.connect();
InputStream is = connection.getInputStream();
if ("gzip".equalsIgnoreCase(connection.getContentEncoding()))
{
is = new …Run Code Online (Sandbox Code Playgroud) 我有一个Java应用程序(JDK 1.7.0_13),并使用java.net.HttpURLConnection连接到一些基于servlet的服务进行会话管理.我试图弄清楚如何使用java.net.CookieManager来跟踪会话cookie.阅读文档我得到的印象是,使用CookieHandler.setDefault(新的CookieManager())安装CookieManager会导致cookie管理自动发生.但是,对同一URL的多个请求似乎不保留cookie.我是否必须手动从响应中提取cookie并在我自己的请求中重新发送它们,或者CookieManager是否会自动为我执行此操作?如果CookieManager没有,那么它添加了什么值?
为了测试一些东西,我有一个servlet,每当我的浏览器访问一个URL时,它就会成功递增一个计数器.这可以在Safari,FireFox和Chrome中正常工作......但是,我无法从独立的Java应用程序中使用它.
这是一个非常简单的测试程序,用于说明我希望简单的工作.它在开始时安装CookieManager,然后在控制台输入URL时重复调用fetch(String urlString)方法.
package com.brilliant.experimental;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpFetcher {
public static void fetch(String urlString) {
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
InputStream in = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
int status = conn.getResponseCode();
System.out.println("Status = " + status);
String key;
System.out.println("Headers-------start-----");
for (int i = 1; (key = conn.getHeaderFieldKey(i)) != null; i++) {
System.out.println(key + …Run Code Online (Sandbox Code Playgroud) 我有兴趣重用一个HttpUrlConnection(作为我正在开发的服务器和客户端之间的状态协议的一部分).我知道持久性http有一个Connection = keep-alive标头.现在,我想知道如何重用这种结合.我写了这段代码:
URL u = new java.net.URL("http://localhost:8080/Abc/Def");
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setRequestProperty("Connection", "keep-alive");
c.setHeader("A","B");
c.getInputStream() //here I see that server gets my messages (using DEBUG)
c.setHeader("B","C"); //
Run Code Online (Sandbox Code Playgroud)
现在我如何重新发送这个"B"标头到服务器,我尝试重新连接等,但没有任何东西让它工作.
而服务器也执行 response.setHeader("Connection", "keep-alive");
我看过许多论坛,但没有人写过这个.也许HttpURLConnection不处理这个?
我试图改进Java Html文档一点点,但我遇到了问题HttpUrlConntion.有一点是,如果用户代理是Java VM,某些服务器会阻止请求.另一个问题是HttpUrlConnection没有设置Referrer或Location头字段.由于几个站点使用这些字段来验证内容是从他们自己的站点访问的,因此我也被阻止了.据我所知,唯一的解决方案是替换HTTP协议的URL处理程序.或者有没有办法修改默认的HTTP Handler?
如果我尝试使用HttpURLConnection和连接到"https"有什么区别HttpsURLConnection?
我能够使用两者连接到"https" HttpURLConnection,HttpsURLConnection所以我很困惑.如果我使用的话,我想我只能建立与"https"的连接HttpsURLConnection?
以下是我的一些问题:
SSLSocketFactory与HostnameVerifier我HttpURLConnection同时连接的"https"开头,怎么SSLSocketFactory和HostnameVerifier我使用的?我试图解析XML response,但我失败了.我最初认为xml只是没有在回复中返回,所以我通过直接链接到我的xml文件在线制作了下面的代码.我能够毫无问题地打印XML到屏幕.但是,当我调用我的parse方法时,我得到文件的过早结束.
如果我直接传递URL,它可以工作:
但是当我传递一个InputStream时失败:
builder.parse(connection.getInputStream());
try {
URL url = new URL(xml);
URLConnection uc = url.openConnection();
HttpURLConnection connection = (HttpURLConnection )uc;
connection.setDoInput(true);
connection.setDoOutput(true);
InputStream instream;
InputSource source;
//get XML from InputStream
if(connection.getResponseCode()>= 200){
connection.connect();
instream = connection.getInputStream();
parseDoc(instream);
}
else{
instream = connection.getErrorStream();
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException …Run Code Online (Sandbox Code Playgroud)我想从以下内容中检索JSON数据:https: //git.eclipse.org/r/#/c/11376/
请求网址: https://git.eclipse.org/r/gerrit/rpc/ChangeDetailService
请求方法: POST
请求标题:
Accept:application/json
Content-Type:application/json; charset=UTF-8
Run Code Online (Sandbox Code Playgroud)
请求有效负载:
{"jsonrpc":"2.0","method":"changeDetail","params":[{"id":11376}],"id":1}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这个答案,但我得到了400 BAD REQUEST.
任何人都可以帮我解决这个问题吗?
谢谢.