- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用Android中的HttpURLConnection对象进行HTTP GET。
更新
我尝试连接到其他服务器。这也托管在Cloud 9(c9.io)中,并且还返回json响应。这次,我没有收到301重定向,但得到的是服务器应该发送的实际响应。
由于这意味着问题已在服务器中本地化,因此我重新组织了以下部分,以便重点阅读与服务器相关的信息。 Android相关信息已移至问题末尾。
我要连接的地方:
Cloud9上的开发服务器
使用Laravel Framework 5.2(由于不支持的项目依赖性,我们目前无法升级到5.3)
服务器应返回JSON答案
如果通过浏览器连接到相同的URL,我将获得正确的响应(JSON字符串。必需的HTTP标头和“ 200” HTTP响应代码)
我在哪里连接
Android手机(在Android 6.0上为Oneplus 3)
编译SDK版本:23
使用构建工具:“ 23.0.3”
使用Min SDK版本:19
使用目标SDK版本:22
我正在使用HttpURLConnection对象和HTTP方法“ GET”进行连接
Android上的HTTP响应
运行代码时,我从服务器获取以下结果:
HTTP响应代码为301
,但消息为null
。
新的URL完全相同,但是使用HTTPS。似乎服务器以某种方式强制SSL / TSL加密。从浏览器访问HTTP时不会发生这种情况。
HTTP标头(在Android上):
日期=>星期二,2016年10月4日05:56:26 GMT
location => https://domain.com/route/(我修改了此位)
内容长度=> 382
内容类型=> text / html;字符集= iso-8859-1
X-BACKEND => apps-proxy
X-Android-Selected-Protocol => http / 1.1
X-Android-Sent-Millis => 1475560583894
X-Android-Received-Millis => 1475560585637
X-Android-Response-Source => NETWORK 301
null => HTTP / 1.1 301
其他资料
由于服务器似乎希望Android使用HTTPS,因此我尝试将代码修改为使用HTTPS(HttpsURLConnection)。这可能会或可能不会解决此问题,但是由于出现烦人的SSL handshake failed
错误,因此我无法对其进行检查。另外,我不需要对此应用程序进行加密,因此我不愿意解决随之而来的问题。
所有这些都在AsyncTask对象中运行(因为当您尝试在主线程上使用网络连接时,Android会变得烦躁)。
设置新服务器(在Cloud 9之外并且没有任何SSL / TSL)可能是一种选择,但是我不愿意这样做,因为这将非常耗时。
我尝试使用完全相同的代码连接到另一台Cloud 9服务器(该服务器还返回json响应),并且一切正常。这表明该问题是由HTPP 301错误引起的。
我将尝试与您分享您可能需要的其他信息来回答我的问题!
本机Android内容(在UPDATE上移动,请参见上文)
响应内容似乎是不完整的JSON:
{ 'status':'ERROR'
}
字符,这是响应实际包含的内容。这在工作流程中注入了(对我而言)未知的地方。当我捕获HTTP响应(使用我的PC上的Charles,将其设置为手机的Wi-Fi连接的代理)时,其内容是(如预期的那样)简单的HTML,告诉您重定向(HTPP代码301)到新路由。
this.setURL(ruta); //gets correct url
HttpURLConnection cxn = (HttpURLConnection) this.getURL().openConnection(); //init
cxn.setRequestMethod("GET"); //use HTTP GET verb
cxn.setUseCaches(false); //no cache
cxn.setRequestProperty("Cache-Control", "no-cache"); //even less cache
cxn.setDoOutput(false); //only true in POST/PUT requests
cxn.setRequestProperty("Connection","keep-alive");
cxn.setRequestProperty("DNT", "1"); //TEMP
cxn.setInstanceFollowRedirects(true); //should follow redirects
cxn.setRequestProperty( "charset", "utf-8");
int status_code = cxn.getResponseCode();
InputStream responseStream = new BufferedInputStream(cxn.getInputStream());
BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream));
String line = "";
StringBuilder stringBuilder = new StringBuilder();
while ((line = responseStreamReader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
responseStreamReader.close();
String response = stringBuilder.toString();
cxn.disconnect();
最佳答案
删除用于创建HttpURLConnection
的代码,然后尝试使用以下代码:
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL("http://www.domain.com/index.aspx?parameter1=X¶meter2=X"); //Use your url and add the GET parameters
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setInstanceFollowRedirects(false); /* added line */
InputStream in = urlConnection.getInputStream();
InputStreamReader isw = new InputStreamReader(in);
int data = isw.read();
while (data != -1) {
char current = (char) data;
data = isw.read();
System.out.print(current);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
GET
请求设置的全部内容。
public class MainActivity extends AppCompatActivity {
public String response;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.rTextView);
RequestQueue queue = Volley.newRequestQueue(this);
String url = "yourWebserviceUrl";
// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener < String > () {
@Override
public void onResponse(String response) {
textView.setText("Response is: " + response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
textView.setText("That didn't work!");
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
}
}
{"status":"ok","found":false,"extra":"App\\Scanners"}
关于java - Android HttpURLConnection接收HTTP 301响应代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39845854/
我一直在研究一个调用 Rest API 的 portlet。当API被调用且请求的数据不存在时,返回相应的JSON格式的错误信息(带有Bad request http code - 400),如果id
我有这个在 Windows VM 上运行的简单代码: URL url = new URL("http:xxx.xxx.xxx.xxx/api/cities.json"); HttpURLConnect
我有一个这样的代码: HttpURLConnection connection = (HttpURLConnection) loginUrl.openConnection(); connection.
Google 提供了 2 个不同的 HttpURLConnection 用法示例。 调用InputStream的close http://developer.android.com/training/
我想对自己编写的HTTP Servlet发出POST请求。通过使用URL.openConnection()方法,好的情况(HTTP响应代码200)始终可以正常工作。但是当我收到所需的错误响应代码(例如
您好,我已经开始使用 HttpUrlConnection,我有一个关于 Http 请求实际发送时间的问题。 我在某处读到,调用 getInputStream() 时会发送实际请求。不过,我已经编写了一
从 android 创建 HTTPURLConnection 时,有人对何时关闭连接和何时断开连接有任何经验吗?是否应该始终使用断开连接,以便可以从池中重用连接而不是重新创建连接?使用断开连接与关闭有
问题: 尝试“连接”时出现间歇性但频繁的故障。 代码、调试消息和堆栈跟踪如下。我看过类似的 问题解答,以及 android 开发人员帮助,但找不到 对失败的回答。 任何帮助表示赞赏。 编码: publ
我一直在尝试创建一个小的应用程序,该应用程序连接到editText中的url并返回状态代码。 这是onCreate代码: override fun onCreate(savedInstanceSta
我正在尝试创建 get 连接,但是当我读取服务器上的 header 时,我发现请求方法接收为 POST 而不是 GET 最佳答案 尝试删除此行:connection.setDoOutput(true)
我正在尝试将 x-www-form-urlencoded 格式的正文发送到我的本地 Web API。我可以毫无问题地进行 GET 。这是我所做的: String urlParameters =
我是 Android 开发新手,在互联网上进行了一些咨询后,我想出了以下代码来连接到 Url、POST 字符串内容并读取其响应。 private static java.lang.String get
我使用 HTTPUrlConnection 和 GET 方法从服务器获取数据,返回字符串大约 13k 个字符,但我只收到 1228 个字符。 有什么解决方案可以超过接收所有字符吗? 这是我的代码: U
我正在使用 HttpUrlConnection 来使用 REST 服务。当我执行 GET 时,就像下面显示的那样,我不想获取逐个字符返回的信息。我想以返回的格式获得结果。例如,在这里,我想获得一个 b
我从互联网上找到了下面的两段代码,我正在我的应用程序中使用它。 我真的不明白的一件事是,为什么没有调用 HttpUrlConnection.connect() 来建立 Http 连接(握手),并且没有
当使用下面的代码发出 get 请求时: private String get(String inurl, Map headers, boolean followredirects) throws Ma
我向我的用户提供下载文件的机会。 有时这个文件非常大,我在下载时实现一个 ProgressDialog。 好吧,如果用户点击返回,我想取消AsyncTask并关闭连接: @Ov
我正在尝试使用 Java 建立与立交桥的服务器连接。但是,当我的请求参数中有空格(例如 Bulach West)时,我总是会收到错误的请求响应。我使用的代码如下: StringBuilder cont
我使用 HttpURLConnection 按顺序向服务器 HttpServer 发出多个短请求。我期望的最大吞吐量是多少?我无法获得超过 25 条记录/秒的数据。 我需要每秒至少 5000 条记录。
我使用以下连接来恢复下载: connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); co
我是一名优秀的程序员,十分优秀!