gpt4 book ai didi

java - Android HttpURLConnection接收HTTP 301响应代码

转载 作者:行者123 更新时间:2023-11-29 08:41:28 25 4
gpt4 key购买 nike

我正在尝试使用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)到新路由。

无效的JSON代码(上述)不存在,但有效的HTML存在。

这表明无效的JSON出现在我的代码内部(而不是在服务器或传输器上)内部。但是我的应用程序上没有生成JSON字符串的代码,更不用说将其注入到我正在处理的响应中了。

HttpURLConnection的代码

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&parameter2=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请求设置的全部内容。

编辑:

我已经使用 Volley测试了Web服务,这是我用来检索Web服务响应的代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com