Android HttpURLConnection을 사용하여 HTTP 가져 오기
저는 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));
}
}
}
여기에서 입력 스트림을 가져 오면 다음과 같이 텍스트 데이터를 가져올 수 있습니다.
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();
}
}
버퍼 된 리더와 같은 다른 입력 스트림 리더를 사용할 수도 있습니다.
문제는 연결을 열 때 데이터를 '풀'하지 않는다는 것입니다.
여기에 완전한 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");
Activity 클래스에 대한 callBack (delegate) 응답으로 만들었습니다.
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();
}
필요에 따라 수정할 수 있습니다. 그것은 얻을 것이다
매우 간단한 호출이 필요한 경우 URL을 직접 사용할 수 있습니다.
import java.net.URL;
new URL("http://wheredatapp.com").openStream();
간단하고 효율적인 솔루션 : Volley 사용
StringRequest stringRequest = new StringRequest(Request.Method.GET, finalUrl ,
new Response.Listener<String>() {
@Override
public void onResponse(String){
try {
JSONObject jsonObject = new JSONObject(response);
HashMap<String, Object> responseHashMap = new HashMap<>(Utility.toMap(jsonObject)) ;
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("api", error.getMessage().toString());
}
});
RequestQueue queue = Volley.newRequestQueue(context) ;
queue.add(stringRequest) ;
URL url = new URL ( " https://www.google.com ");
// 사용중인 경우
URLConnection conn = url.openConnection ();
//로 변경
HttpURLConnection conn = (HttpURLConnection) url.openConnection ();
참고 URL : https://stackoverflow.com/questions/8654876/http-get-using-android-httpurlconnection
'development' 카테고리의 다른 글
여러 서버의 단일 SSL 인증서 (0) | 2020.12.12 |
---|---|
Linux 패키지 저장소의 * -dev 패키지에는 실제로 무엇이 포함되어 있습니까? (0) | 2020.12.12 |
크롬이 디버그 모드로 들어가는 것을 막는 방법? (0) | 2020.12.11 |
SSH 프로토콜을 통해 Github Gist를 복제하는 방법은 무엇입니까? (0) | 2020.12.11 |
Java를 사용하여 Selenium WebDriver로 브라우저 로그 캡처 (0) | 2020.12.11 |