dev_eun
[Android] HttpURLConnection으로 POST 요청하기 본문
프로젝트에서 팀원이 만든 restful API에 POST 요청을 해야 하는데, 어떻게 하는지 몰라서 방황했다.
잊어버릴까봐 기록
참고 : privatedevelopnote.tistory.com/18
참고 코드
public class HttpConnection extends AsyncTask<String, Void, String> {
private static final String TAG = "@@@";
@Override
protected String doInBackground(String... params) {
final String urlStr = "요청할 서버 url";
final String twoHyphens = "--";
String[] dataName = {"보낼 데이터 key"};
String resp = null;
String lineEnd = "\r\n";
String boundary = "androidupload";
File targetFile = new File(params[2]);
byte[] buffer;
int maxBufferSize = 5 * 1024 * 1024;
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) new URL(urlStr).openConnection();
} catch (IOException e) {
e.printStackTrace();
}
try {
assert conn != null;
conn.setRequestMethod("POST");
} catch (ProtocolException e) {
e.printStackTrace();
}
conn.setReadTimeout(10000);
conn.setConnectTimeout(10000);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
String delimiter = twoHyphens + boundary + lineEnd; // --androidupload\r\n
StringBuilder postDataBuilder = new StringBuilder();
// 본인은 고정된 파라미터 개수이기 때문에 이렇게 사용
for (int i = 0; i < 2; i++) {
postDataBuilder.append(delimiter);
postDataBuilder.
append("Content-Disposition: form-data; name=\"").
append(dataName[i]).append("\"").
append(lineEnd).
append(lineEnd).
append(params[i]).
append(lineEnd);
}
postDataBuilder.append(delimiter);
postDataBuilder.
append("Content-Disposition: form-data; name=\"").
append(dataName[2]).
append("\";filename=\"").
append(targetFile.getName()).
append("\"").append(lineEnd);
try {
DataOutputStream ds = new DataOutputStream(conn.getOutputStream());
ds.write(postDataBuilder.toString().getBytes());
ds.writeBytes(lineEnd);
FileInputStream fStream = new FileInputStream(targetFile);
buffer = new byte[maxBufferSize];
int length = -1;
while ((length = fStream.read(buffer)) != -1) {
ds.write(buffer, 0, length);
}
ds.writeBytes(lineEnd);
ds.writeBytes(lineEnd);
ds.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // requestbody end
fStream.close();
ds.flush();
ds.close();
int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
String line = null;
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = br.readLine()) != null) {
resp += line;
}
}
} catch (IOException e) {
e.printStackTrace();
}
return resp;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Log.d(TAG, "onPostExecute: " + result);
}
}
728x90
'기타 > 안드로이드' 카테고리의 다른 글
[Android & React] 웹뷰(react)에서 안드로이드 함수 사용하기, 안드로이드에서 웹뷰(react) 함수 사용하기 (0) | 2020.10.15 |
---|---|
[Android] 안드로이드 Vibrator 사용법 (0) | 2020.02.23 |
[Android] 무음/진동 모드에서 벨,알람 울리기 (0) | 2020.02.17 |
[Android Studio] MacOS 단축키 (0) | 2020.02.16 |