Android

Http Get using Android HttpURLConnection

Http Get с помощью Android HttpURLConnection

Я новичок в разработке на Java и Android и пытаюсь создать простое приложение, которое должно связываться с веб-сервером и добавлять некоторые данные в базу данных с помощью http get.

Когда я выполняю вызов с помощью веб-браузера на своем компьютере, он работает просто отлично. Однако, когда я выполняю вызов, запуская приложение в эмуляторе Android, данные не добавляются.

Я добавил разрешение доступа в Интернет в манифест приложения. Logcat не сообщает о каких-либо проблемах.

Кто-нибудь может помочь мне разобраться, что не так?

Вот исходный код:

package com.example.httptest;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class HttpTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

TextView tv = new TextView(this);
setContentView(tv);

try {
URL url = new URL("http://www.mysite.se/index.asp?data=99");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.disconnect();
tv.setText("Hello!");
}
catch (MalformedURLException ex) {
Log.e("httptest",Log.getStackTraceString(ex));
}
catch (IOException ex) {
Log.e("httptest",Log.getStackTraceString(ex));
}
}
}
Переведено автоматически
Ответ 1

Попробуйте получить входной поток из этого, затем вы можете получить текстовые данные следующим образом:-

    URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL("http://www.mysite.se/index.asp?data=99");

urlConnection = (HttpURLConnection) url
.openConnection();

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();
}
}

Вероятно, вы также можете использовать другие средства чтения входного потока, такие как buffered reader.

Проблема в том, что когда вы открываете соединение - оно не "вытягивает" никаких данных.

Ответ 2

Вот полный AsyncTask класс

public class GetMethodDemo extends AsyncTask<String , Void ,String> {
String server_response;

@Override
protected String doInBackground(String... strings) {

URL url;
HttpURLConnection urlConnection = null;

try {
url = new URL(strings[0]);
urlConnection = (HttpURLConnection) url.openConnection();

int responseCode = urlConnection.getResponseCode();

if(responseCode == HttpURLConnection.HTTP_OK){
server_response = readStream(urlConnection.getInputStream());
Log.v("CatalogClient", server_response);
}

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return null;
}

@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);

Log.e("Response", "" + server_response);


}
}

// Converting InputStream to String

private String readStream(InputStream in) {
BufferedReader reader = null;
StringBuffer response = new StringBuffer();
try {
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
response.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return response.toString();
}

Для вызова этого AsyncTask класса

new GetMethodDemo().execute("your web-service url");
Ответ 3

Я создал с помощью обратного вызова (делегирования) ответ на класс Activity.


public class WebService extends AsyncTask<String, Void, String> {

private Context mContext;
private OnTaskDoneListener onTaskDoneListener;
private String urlStr = "";

public WebService(Context context, String url, OnTaskDoneListener onTaskDoneListener) {
this.mContext = context;
this.urlStr = url;
this.onTaskDoneListener = onTaskDoneListener;
}

@Override
protected String doInBackground(String... params) {
try {

URL mUrl = new URL(urlStr);
HttpURLConnection httpConnection = (HttpURLConnection) mUrl.openConnection();
httpConnection.setRequestMethod("GET");
httpConnection.setRequestProperty("Content-length", "0");
httpConnection.setUseCaches(false);
httpConnection.setAllowUserInteraction(false);
httpConnection.setConnectTimeout(100000);
httpConnection.setReadTimeout(100000);

httpConnection.connect();

int responseCode = httpConnection.getResponseCode();

if (responseCode == HttpURLConnection.HTTP_OK) {
BufferedReader br = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
br.close();
return sb.toString();
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);

if (onTaskDoneListener != null && s != null) {
onTaskDoneListener.onTaskDone(s);
} else
onTaskDoneListener.onError();
}
}

где

public interface OnTaskDoneListener {
void onTaskDone(String responseData);

void onError();
}

Вы можете изменять в соответствии с вашими потребностями. Это для get

Ответ 4

Если вам просто нужен очень простой вызов, вы можете использовать URL напрямую:

import java.net.URL;

new URL("http://wheredatapp.com").openStream();
java