Android를 사용하여 HTTP 요청 만들기
검색해봤는데 답을 못 찾았는데, 간단한 HTTP 요청 방법이 있나요?웹 사이트 중 하나에서 PHP 페이지/스크립트를 요청하고 싶은데 웹 페이지를 표시하고 싶지 않습니다.
가능하면 백그라운드(BroadcastReceiver)에서도 수행하고 싶습니다.
갱신하다
이것은 아주 오래된 대답입니다.저는 더 이상 아파치의 고객을 추천하지 않을 것입니다.대신 다음 중 하나를 사용합니다.
원답
먼저 네트워크 액세스 권한을 요청하고 매니페스트에 다음을 추가합니다.
<uses-permission android:name="android.permission.INTERNET" />
Android와 함께 번들로 제공되는 Apache http 클라이언트를 사용하는 것이 가장 쉬운 방법입니다.
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(new HttpGet(URL));
StatusLine statusLine = response.getStatusLine();
if(statusLine.getStatusCode() == HttpStatus.SC_OK){
ByteArrayOutputStream out = new ByteArrayOutputStream();
response.getEntity().writeTo(out);
String responseString = out.toString();
out.close();
//..more logic
} else{
//Closes the connection.
response.getEntity().getContent().close();
throw new IOException(statusLine.getReasonPhrase());
}
별도의 스레드에서 실행하려면 비동기 작업을 확장하는 것이 좋습니다.
class RequestTask extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... uri) {
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response;
String responseString = null;
try {
response = httpclient.execute(new HttpGet(uri[0]));
StatusLine statusLine = response.getStatusLine();
if(statusLine.getStatusCode() == HttpStatus.SC_OK){
ByteArrayOutputStream out = new ByteArrayOutputStream();
response.getEntity().writeTo(out);
responseString = out.toString();
out.close();
} else{
//Closes the connection.
response.getEntity().getContent().close();
throw new IOException(statusLine.getReasonPhrase());
}
} catch (ClientProtocolException e) {
//TODO Handle problems..
} catch (IOException e) {
//TODO Handle problems..
}
return responseString;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
//Do anything with response..
}
}
그런 다음 다음을 통해 요청할 수 있습니다.
new RequestTask().execute("http://stackoverflow.com");
Apache HttpClient를 선택해야 하는 명시적인 이유가 없는 한 java.net 을 선호해야 합니다.URL 연결.당신은 웹에서 그것을 사용하는 방법의 많은 예를 찾을 수 있습니다.
우리는 또한 당신의 원래 게시물 이후로 안드로이드 문서를 개선했습니다: http://developer.android.com/reference/java/net/HttpURLConnection.html
그리고 우리는 공식 블로그 http://android-developers.blogspot.com/2011/09/androids-http-clients.html 에서 절충안에 대해 이야기했습니다.
참고: Android와 함께 제공되는 Apache HTTP Client는 이제 HttpURL Connection을 위해 더 이상 사용되지 않습니다.자세한 내용은 Android Developers 블로그를 참조하십시오.
더하다<uses-permission android:name="android.permission.INTERNET" />
당신의 매니페스토까지.
그런 다음 다음과 같은 웹 페이지를 검색합니다.
URL url = new URL("http://www.android.com/");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in);
}
finally {
urlConnection.disconnect();
}
또한 별도의 스레드에서 실행하는 것이 좋습니다.
class RequestTask extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... uri) {
String responseString = null;
try {
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
if(conn.getResponseCode() == HttpsURLConnection.HTTP_OK){
// Do normal input or output stream reading
}
else {
response = "FAILED"; // See documentation for more info on response handling
}
} catch (ClientProtocolException e) {
//TODO Handle problems..
} catch (IOException e) {
//TODO Handle problems..
}
return responseString;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
//Do anything with response..
}
}
응답 처리 및 POST 요청에 대한 자세한 내용은 설명서를 참조하십시오.
가장 간단한 방법은 발리라는 안드로이드 lib를 사용하는 것입니다.
발리는 다음과 같은 이점을 제공합니다.
네트워크 요청의 자동 예약.여러 개의 동시 네트워크 연결.표준 HTTP 캐시 일관성을 통해 투명한 디스크 및 메모리 응답 캐싱.요청 우선 순위 지정 지원.취소요청 API.단일 요청을 취소하거나 취소할 요청의 블록 또는 범위를 설정할 수 있습니다.재시도 및 백오프와 같은 사용자 지정의 용이성네트워크에서 비동기식으로 가져온 데이터로 UI를 올바르게 채울 수 있도록 하는 강력한 순서 지정.디버깅 및 추적 도구입니다.
다음과 같이 간단하게 http/https 요청을 보낼 수 있습니다.
// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.yourapi.com";
JsonObjectRequest request = new JsonObjectRequest(url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
if (null != response) {
try {
//handle your response
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
queue.add(request);
이 경우 Volley에서 이미 수행한 작업이므로 "백그라운드에서 실행"하거나 "캐시 사용"할 필요가 없습니다.
위에서 제안한 대로 발리를 사용합니다.build.gradle에 다음을 추가합니다(모듈: app).
implementation 'com.android.volley:volley:1.1.1'
AndroidManifest.xml에 다음을 추가합니다.
<uses-permission android:name="android.permission.INTERNET" />
활동 코드에 다음을 추가합니다.
public void httpCall(String url) {
RequestQueue queue = Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// enjoy your response
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// enjoy your error status
}
});
queue.add(stringRequest);
}
이것은 http client를 대체하고 매우 간단합니다.
private String getToServer(String service) throws IOException {
HttpGet httpget = new HttpGet(service);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
return new DefaultHttpClient().execute(httpget, responseHandler);
}
안부 전해요
오늘날 Android와 Java에서 일반적으로 매우 인기 있는 Http 클라이언트인 OkHttp로 요청을 수행하는 방법에 대해 설명한 답변이 없었기 때문에 간단한 예를 제시하겠습니다.
//get an instance of the client
OkHttpClient client = new OkHttpClient();
//add parameters
HttpUrl.Builder urlBuilder = HttpUrl.parse("https://www.example.com").newBuilder();
urlBuilder.addQueryParameter("query", "stack-overflow");
String url = urlBuilder.build().toString();
//build the request
Request request = new Request.Builder().url(url).build();
//execute
Response response = client.newCall(request).execute();
이 라이브러리의 분명한 장점은 낮은 수준의 세부 정보로부터 우리를 추상화하여 그들과 상호 작용할 수 있는 보다 친숙하고 안전한 방법을 제공한다는 것입니다.구문도 단순화되어 멋진 코드를 작성할 수 있습니다.
스레드 사용:
private class LoadingThread extends Thread {
Handler handler;
LoadingThread(Handler h) {
handler = h;
}
@Override
public void run() {
Message m = handler.obtainMessage();
try {
BufferedReader in =
new BufferedReader(new InputStreamReader(url.openStream()));
String page = "";
String inLine;
while ((inLine = in.readLine()) != null) {
page += inLine;
}
in.close();
Bundle b = new Bundle();
b.putString("result", page);
m.setData(b);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
handler.sendMessage(m);
}
}
저는 Gson lib를 사용하여 URL에서 요청할 웹 서비스를 위해 이것을 만들었습니다.
고객:
public EstabelecimentoList getListaEstabelecimentoPorPromocao(){
EstabelecimentoList estabelecimentoList = new EstabelecimentoList();
try{
URL url = new URL("http://" + Conexao.getSERVIDOR()+ "/cardapio.online/rest/recursos/busca_estabelecimento_promocao_android");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
if (con.getResponseCode() != 200) {
throw new RuntimeException("HTTP error code : "+ con.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader((con.getInputStream())));
estabelecimentoList = new Gson().fromJson(br, EstabelecimentoList.class);
con.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return estabelecimentoList;
}
그라들을 통해 이용할 수 있는 이 멋진 새 도서관을 보세요 :)
build.gradle:compile 'com.apptakk.http_request:http-request:0.1.2'
용도:
new HttpRequestTask(
new HttpRequest("http://httpbin.org/post", HttpRequest.POST, "{ \"some\": \"data\" }"),
new HttpRequest.Handler() {
@Override
public void response(HttpResponse response) {
if (response.code == 200) {
Log.d(this.getClass().toString(), "Request successful!");
} else {
Log.e(this.getClass().toString(), "Request unsuccessful: " + response);
}
}
}).execute();
https://github.com/erf/http-request
이것은 안드로이드에서 HTTP Get/POST 요청을 위한 새로운 코드입니다.HTTPClient
제 경우처럼 사용할 수 없을 수도 있습니다.
먼저 build.gradle에 두 가지 종속성을 추가합니다.
compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'org.apache.httpcomponents:httpclient:4.5'
그러면 이 코드를 다음에 쓰십시오.ASyncTask
doBackground
방법.
URL url = new URL("http://localhost:8080/web/get?key=value");
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod("GET");
int statusCode = urlConnection.getResponseCode();
if (statusCode == 200) {
InputStream it = new BufferedInputStream(urlConnection.getInputStream());
InputStreamReader read = new InputStreamReader(it);
BufferedReader buff = new BufferedReader(read);
StringBuilder dta = new StringBuilder();
String chunks ;
while((chunks = buff.readLine()) != null)
{
dta.append(chunks);
}
}
else
{
//Handle else
}
저에게 가장 쉬운 방법은 Retrofit2라는 도서관을 이용하는 것입니다.
요청 방법과 매개 변수를 포함하는 인터페이스를 만들면 되고 각 요청에 대해 사용자 지정 헤더를 만들 수도 있습니다.
public interface MyService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
@GET("user")
Call<UserDetails> getUserDetails(@Header("Authorization") String credentials);
@POST("users/new")
Call<User> createUser(@Body User user);
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first,
@Field("last_name") String last);
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo,
@Part("description") RequestBody description);
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);
}
가장 좋은 점은 엔큐 방식을 사용하여 비동기식으로 쉽게 실행할 수 있다는 것입니다.
2023년에 저는 OkHttpClient를 사용하여 가장 쉬운 솔루션을 찾았습니다.
구현 "com.squareup.okhttp3:okhttp:4.11.0"
코드는 다음과 같습니다.
File f = new File(sourceFileUri);
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("userid", UniqueUserId)
.addFormDataPart("fileToUpload", f.getName(), RequestBody.create(MediaType.parse("image/png"), f))
.build();
Request request = new Request.Builder()
.url("full-path.php")
.post(requestBody)
.build();
System.out.println("Request: "+request.body().toString());
try {
Response response = client.newCall(request).execute();
String body = response.body().string();
System.out.println("Response: " + body);
} catch (Exception e) {
e.printStackTrace();
System.out.println("Error: "+e);
}
언급URL : https://stackoverflow.com/questions/3505930/make-an-http-request-with-android
'programing' 카테고리의 다른 글
테이블의 열을 하나만 업데이트하도록 CSV 가져오기 (0) | 2023.08.10 |
---|---|
열이 구분된 테이블을 사용하여 조회 (0) | 2023.08.10 |
SQL Server CE 데이터베이스 파일을 프로그래밍 방식으로 생성 (0) | 2023.08.10 |
오류 SQL Server Management Studio의 접두사 또는 접미사 문자가 잘못되었습니다. (0) | 2023.08.05 |
ipython 노트북에서 matplotlib 수치 기본 크기를 설정하는 방법은 무엇입니까? (0) | 2023.08.05 |