Retrofit Tutorials
위 링크를 참고해서 만들었습니다.
저는 여기서 REST API를 Spring Boot를 통해서 만들었습니다.
MySQL에 다음과 같은 데이터가 board table에 저장되어 있습니다.
이 데이터는 REST API에서 다음과 같은 코드를 통해 json 타입으로 서버에서 보내집니다.
@RestController
@RequestMapping("/api")
public class BoardApiController{
@Autowired
private BoardRepository repository;
@GetMApping("/boards")
List<Board> all(){
return repository.findAll();
}
Spring Boot에서 바로 실행 했을 경우 주소창에 localhost:8080/api/boards
를 입력하게 되면 다음과 같은 json타입으로 데이터가 나온 것을 볼 수 있습니다.
다음 json data를 구성하는 id, title, content를 안드로이드 버츄얼 디바이스(AVD)에 출력해보겠습니다.
각 파일마다 다음과 같은 코드를 입력해줍니다.
<uses-permission android:name="android.permission.INTERNET" />
dependencies{
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
}
build.gradle 파일에 다음 코드를 작성했으면 상단에 sync now를 눌러주고 기다립니다.
import com.google.gson.annotations.SerializedName;
public class Post {
private long id;
private String title;
private String content;
public long getId() {
return id;
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
}
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
private TextView textViewResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textViewResult = findViewById(R.id.text_view_result);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("{서버를 돌릴 ip주소}:8080")
.addConverterFactory(GsonConverterFactory.create())
.build();
JsonPlaceHolderApi jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
Call<List<Post>> call = jsonPlaceHolderApi.getPosts();
call.enqueue(new Callback<List<Post>>() {
@Override
public void onResponse(Call<List<Post>> call, Response<List<Post>> response) {
if (!response.isSuccessful()) {
textViewResult.setText("Code: " + response.code());
return;
}
List<Post> posts = response.body();
for (Post post : posts) {
String content = "";
content += "ID: " + post.getId() + "\n";
content += "Title: " + post.getTitle() + "\n";
content += "Content: " + post.getContent() + "\n\n";
textViewResult.append(content);
}
}
@Override
public void onFailure(Call<List<Post>> call, Throwable t) {
textViewResult.setText(t.getMessage());
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
tools:context=".MainActivity">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text_view_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/purple_500" />
</androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
public interface RestApi {
@GET("api/boards")
Call<List<Post>> getPosts();
}
자 여기서는 아까 Spring Boot를 실행해서 브라우저에 검색했던 localhost:8080/api/boards
의 api/boards
를 @Get 어노테이션 안에 넣어주게 되면 해당 URL로 매핑됩니다.
정상적으로 AVD에 Spring Boot에서 보낸 json 데이터가 출력된 것을 볼 수 있습니다.
다음과 같이 출력될 경우 네트워크 보안 정책상 권한을 받아야 하므로 AndroidManifest.xml에 다음과 같은 코드를 첨부해야 출력화면과 같이 정상적으로 데이터가 나오게 됩니다.
<application>
android:usesCleartextTraffic="true"
</application>
window키 + R
→ cmd
실행 → ipconfig
입력→ IPv4
주소 확인
안녕하세요 좋은 글 잘 보았습니다:) 다름이 아니라 여쭈어보고 싶은게 있어서 댓글을 남겨드립니다.
1. @RestController
@RequestMapping("/api")
public class BoardApiController{
@Autowired
private BoardRepository repository;
@GetMApping("/boards")
List<Board> all(){
return repository.findAll();
}
이 코드는 어디에 작성을 해야하나요..?
3.("{서버를 돌릴 ip주소}:8080") -> 서버를 돌릴 ip주소라는게 제 pc의 ip 주소 말씀하시는게 맞으실까요?
추가적으로 실례가 안된다면 전체 프로젝트 zip파일을 올려주실수 있으신가요..?
혹시 정확한 파일 구조를 알 수 있을까요?