如何在 MainActivity.java 中发出简单的 HTTP 请求? (Android 工作室)
How can I make a simple HTTP request in MainActivity.java? (Android Studio)
我正在使用 Android Studio,我花了几个小时尝试在我的 MainActivity.java 文件中做一个简单的 HTTP 请求,并尝试了多种方法,并且看到了很多网页关于这个问题,还是想不通。
当我尝试 OkHttp 时,出现无法在主线程上执行的错误。现在我正在尝试这样做:
public static String getUrlContent(String sUrl) throws Exception {
URL url = new URL(sUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.connect();
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String content = "", line;
while ((line = rd.readLine()) != null) {
content += line + "\n";
}
return content;
}
我将该方法直接放在 MainActivity.java 中,我的点击事件从另一个也在 MainActivity.java 中的方法执行它:
try {
String str = getUrlContent("https://example.com/WAN_IP.php");
displayMessage(str);
}
catch(Exception e){
displayMessage(e.getMessage());
}
但现在没有崩溃,我可以看出在开始 "BufferedReader" 的行上抛出了一个异常,但是 e.getMessage() 是空白的。
我是 Android Studio 和 java 的新手,所以请善待并帮助我解决这个非常基本的问题。最终我需要向服务器发送 post 请求,OkHttp 似乎是最好的方式,但我没有在 Android Studio 中找到 OkHttp 的 "Hello World" 记录在线任何地方。
你不应该在主线程上进行网络请求。延迟是不可预测的,它可能会冻结 UI.
Android 如果您使用来自主线程的 HttpUrlConnection
对象,则通过抛出异常来强制执行此行为。
然后您应该在后台发出网络请求,然后在主线程上更新 UI。 AsyncTask
class 对于这个用例非常方便!
private class GetUrlContentTask extends AsyncTask<String, Integer, String> {
protected String doInBackground(String... urls) {
URL url = new URL(urls[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.connect();
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String content = "", line;
while ((line = rd.readLine()) != null) {
content += line + "\n";
}
return content;
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(String result) {
// this is executed on the main thread after the process is over
// update your UI here
displayMessage(result);
}
}
然后您以这种方式开始此过程:
new GetUrlContentTask().execute(sUrl)
如果你使用 okhttp 然后调用异步尝试下面的代码
private final OkHttpClient client = new OkHttpClient();
public void run() throws Exception {
Request request = new Request.Builder()
.url("http://publicobject.com/helloworld.txt")
.build();
client.setConnectTimeout(15, TimeUnit.SECONDS);
client.newCall(request).enqueue(new Callback() {
@Override public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
Headers responseHeaders = response.headers();
for (int i = 0, size = responseHeaders.size(); i < size; i++) {
Log.e(responseHeaders.name(i) , responseHeaders.value(i));
}
Log.e("response",response.body().string());
}
});
}
您可以使用依赖项来发出 HTTP 请求或 HTTPS
请求,使用 OkHttp
访问:https://square.github.io/okhttp
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
我正在使用 Android Studio,我花了几个小时尝试在我的 MainActivity.java 文件中做一个简单的 HTTP 请求,并尝试了多种方法,并且看到了很多网页关于这个问题,还是想不通。
当我尝试 OkHttp 时,出现无法在主线程上执行的错误。现在我正在尝试这样做:
public static String getUrlContent(String sUrl) throws Exception {
URL url = new URL(sUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.connect();
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String content = "", line;
while ((line = rd.readLine()) != null) {
content += line + "\n";
}
return content;
}
我将该方法直接放在 MainActivity.java 中,我的点击事件从另一个也在 MainActivity.java 中的方法执行它:
try {
String str = getUrlContent("https://example.com/WAN_IP.php");
displayMessage(str);
}
catch(Exception e){
displayMessage(e.getMessage());
}
但现在没有崩溃,我可以看出在开始 "BufferedReader" 的行上抛出了一个异常,但是 e.getMessage() 是空白的。
我是 Android Studio 和 java 的新手,所以请善待并帮助我解决这个非常基本的问题。最终我需要向服务器发送 post 请求,OkHttp 似乎是最好的方式,但我没有在 Android Studio 中找到 OkHttp 的 "Hello World" 记录在线任何地方。
你不应该在主线程上进行网络请求。延迟是不可预测的,它可能会冻结 UI.
Android 如果您使用来自主线程的 HttpUrlConnection
对象,则通过抛出异常来强制执行此行为。
然后您应该在后台发出网络请求,然后在主线程上更新 UI。 AsyncTask
class 对于这个用例非常方便!
private class GetUrlContentTask extends AsyncTask<String, Integer, String> {
protected String doInBackground(String... urls) {
URL url = new URL(urls[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.connect();
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String content = "", line;
while ((line = rd.readLine()) != null) {
content += line + "\n";
}
return content;
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(String result) {
// this is executed on the main thread after the process is over
// update your UI here
displayMessage(result);
}
}
然后您以这种方式开始此过程:
new GetUrlContentTask().execute(sUrl)
如果你使用 okhttp 然后调用异步尝试下面的代码
private final OkHttpClient client = new OkHttpClient();
public void run() throws Exception {
Request request = new Request.Builder()
.url("http://publicobject.com/helloworld.txt")
.build();
client.setConnectTimeout(15, TimeUnit.SECONDS);
client.newCall(request).enqueue(new Callback() {
@Override public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
Headers responseHeaders = response.headers();
for (int i = 0, size = responseHeaders.size(); i < size; i++) {
Log.e(responseHeaders.name(i) , responseHeaders.value(i));
}
Log.e("response",response.body().string());
}
});
}
您可以使用依赖项来发出 HTTP 请求或 HTTPS 请求,使用 OkHttp
访问:https://square.github.io/okhttp
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}