본문 바로가기
슬기로운 자바 개발자 생활/안드로이드 프로그래밍

스프링 안드로이드(Spring for Android) POST 테스트해보기

by 슬기로운 동네 형 2016. 4. 22.
반응형

레트로핏을 사용할까? 스프링 rest를 사용할까? 고민중입니다. 한번 스프링으로 테스트를 해보며 장단점을 파악해봅니다.

그런데 장점이 뭔지 단점이 뭔지... 아직 내공이 부족해서 모르겠다는...ㅠ.ㅠ

1.서버코딩(아주 간단)

@RestController
@RequestMapping("/api/")
public class ApiControll {

private static final Logger logger = LoggerFactory.getLogger(ApiControll.class);

@RequestMapping(value= "expost",method= RequestMethod.POST)
public String TestPost(HttpServletRequest request) {
try{

String first_name = request.getParameter("first_name");
String last_name = request.getParameter("last_name");
logger.info("첫번째 이름 : "+ first_name);
logger.info("두번째 이름 : "+ last_name);
return "정상적으로 데이터를 받았습니다";
}catch (Exception e){
e.printStackTrace();
return "서버작업 실행도중 에러가 발생했습니다";
}
}}

2. 안드로이드 그래들 설정 패키징옵션 꼭 들어가야 되더라고요

매니페스트에 꼭 인터넷 설정넣기요.

<uses-permission android:name="android.permission.INTERNET" />


    packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/license.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/ASL2.0'
exclude 'META-INF/notice.txt'
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE'
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.11'
compile 'com.fasterxml.jackson.core:jackson-databind:2.3.2'
}

3. 안드로이드XML 레이아웃

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="scg.com.springrest_test.MainActivity">

<EditText
android:id="@+id/et_str"
android:hint="서버에 보낼 메세지"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<Button
android:id="@+id/btn_posttest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="서버전송테스트"
android:onClick="mOnClick"
/>

<TextView
android:id="@+id/tx_str"
android:text="서버에서 온 글자"
android:textSize="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>


4. MainActivity

package scg.com.springrest_test;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AbstractAsyncActivity {

TextView tx_txt;
EditText et_str;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

tx_txt = (TextView) findViewById(R.id.tx_str);
et_str = (EditText) findViewById(R.id.et_str);
}

public void mOnClick(View v){
new Post().execute();
}

private class Post extends AsyncTask<Void,Void,String> {

//R.string.base_uri => http://192.168.1.102:8080
final String url = getString(R.string.base_uri) + "/api/expost";

@Override
protected void onPreExecute() {

//사이클 프로그래스바 시작
setMessage("서버로부터 정보를 가져옵니다.");
showLoadingProgressDialog();
}

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

MultiValueMap<String, String> parameters = new LinkedMultiValueMap<String, String>();
parameters.add("first_name", "shim");
parameters.add("last_name", "sha sha");

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(parameters, headers);

RestTemplate restTemplate = new RestTemplate();

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(new FormHttpMessageConverter());
messageConverters.add(new StringHttpMessageConverter());
restTemplate.setMessageConverters(messageConverters);

String result = restTemplate.postForObject(url, parameters, String.class);

return result;
}

@Override
protected void onPostExecute(String s) {
//사이클 프로그래스바 종료
dismissProgressDialog();
Toast.makeText(getApplicationContext(), "결과값은 : " + s, Toast.LENGTH_SHORT).show();
}
}

}


5. 프로그래스바 ... 클래스를 붙였습니다. 인터넷에서 검색하다가 수집해 놓았던 코드인데... 어디서 가져온건지 기억이 안납니다.

public class AbstractAsyncActivity extends Activity{
protected static final String TAG = AbstractAsyncActivity.class.getSimpleName();

private ProgressDialog progressDialog;

private boolean destroyed = false;

private String message;

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

// ***************************************
// Activity methods
// ***************************************
@Override
protected void onDestroy() {
super.onDestroy();
destroyed = true;
}

// ***************************************
// Public methods
// ***************************************
public void showLoadingProgressDialog() {
this.showProgressDialog(getMessage());
}

public void showProgressDialog(CharSequence message) {
if (progressDialog == null) {
progressDialog = new ProgressDialog(this);
progressDialog.setIndeterminate(true);
}

progressDialog.setMessage(message);
progressDialog.show();
}

public void dismissProgressDialog() {
if (progressDialog != null && !destroyed) {
progressDialog.dismiss();
}
}
}


스프링 서버에 시큐리티는 빼놓은 상태입니다.

혹시나 정말 초보인분들... 서버에서 시큐리티 인증이 걸려있는 url에 접근하시게 되면 아래 코딩 참고해서 추가 하시면 될듯합니다.

저는 안드로이드에서 접근해서 서버의 정보를 가져오는 api는 시큐리티를 빼놓고 서비스를 만들계획이라서 빼놓았답니다.

HttpAuthentication authHeader = new HttpBasicAuthentication(username, password);
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAuthorization(authHeader);

제가 내공이 부족해서 메세지 컨버터의 정확한 역할이 조금 헤깔리네요.

참고 사이트 : http://projects.spring.io/spring-android/ 

반응형

댓글