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

Retrofit 통신중 GET 예제

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

1. 서버에서 가져올 값을 담을 VO 객체 클래스 만들기 Message.class

2. 인터페이스 클래스 만들기 interface Server


서버와의 통신 관련 프로그래밍을 어떤 방식으로 할까 고민하고 이것저것 예제를 보고 연습하다가 Retrofit를 사용하기로 마음을 먹었습니다.

생짜로 코딩하는 방식은 여유가 있을때 하고 신속, 안정적으로 구현을 해야 하기 때문에 아무래도 고수들이 만들어놓은 라이브러리를 활용하는게 현명한 방법인듯해서 선택했습니다.

 제가 몇번 실습을 해봤는데, 며칠 일을 손을 놓을 일이 생겨 일주일만에 본격적으로 코딩을 하려하니 잘 안되네요.

간단하게 스프링부트 서버에 접근해서 get으로 단순히 문자하나 들고 오는 예제입니다.


스프링 부트 서버

@RestController
@RequestMapping("/api/")
public class ApiControll {
private static final Logger logger = LoggerFactory.getLogger(ApiControll.class);
/*단순 문자열값 리턴 메서드*/
@RequestMapping(value= "exString")
public Message TestMessage() {
Message mes = new Message("안녕하세요");
logger.info("서버 호출을 합니다.");
return mes;
}
class Message{
String msg;

public Message(String msg) {
this.msg = msg;
}

public String getMsg() {
return msg;
}

public void setMsg(String msg) {
this.msg = msg;
}
}


안드로이드 버튼하나 누르면 서버에 "안녕하세요" 값을 들고 옴.

public class MainActivity extends AppCompatActivity {

public static String SERVER_ADRESS = "http://192.168.1.101:8080";

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

Button button = (Button) findViewById(R.id.btn);

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

final Call<Message> messageCall = RetrofitServiceImplFactory.serverCon().getMlist();

messageCall.enqueue(new Callback<Message>() {
@Override
public void onResponse(Response<Message> response, Retrofit retrofit) {

final Message message = response.body();

Toast.makeText(getApplicationContext(),"온값은:"+message.getMsg(),Toast.LENGTH_SHORT).show();
}

@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
});

}
});
}

static class RetrofitServiceImplFactory{
private static Retrofit getretrofit(){
return new Retrofit.Builder()
.baseUrl(SERVER_ADRESS)
.addConverterFactory(GsonConverterFactory.create()).build();
}

public static Server serverCon(){
return getretrofit().create(Server.class);
}
}

public interface Server {

@GET("/api/exString")
Call<Message> getMlist();
}

class Message{
String msg;

public Message(String msg) {
this.msg = msg;
}

public String getMsg() {
return msg;
}

public void setMsg(String msg) {
this.msg = msg;
}
}

}


xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
android:orientation="vertical"
tools:context="scg.com.posttest.MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="서버통신 테스트 레트로핏" />


<Button
android:id="@+id/btn"
android:text="기본값가져오기"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>


Gradle 설정<module>

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.3"

defaultConfig {
applicationId "scg.com.posttest"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
packagingOptions {
exclude 'META-INF/services/javax.annotation.processing.Processor'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta1'
}


자꾸 간단하게 앱하나 만들어서 테스트 할때 manifests에 퍼미션 입력하는 것을 잊어 버리네요.

계속 안되길래 Exception 찍어보니 퍼미션 넣으라네요...ㅠ.ㅠ

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

http://square.github.io/retrofit/




반응형

댓글