Android Retrofit2 POST form-data Body & Basic Auth
SomeBasicAuth.kt
// 임의의 아이디, 비밀번호
val testId = "someTestId"
val testPw = "someTestPw"
// base64 인코딩
val basicAuth = Credentials.basic(testId, testPw)
val someRepository = SomeRepository(basicAuth)
val somePost = someRepository.createPost("someTitle", "someContent", "someExcerpt")
임의의 계정 정보를 base64로 인코딩한다. – (Basic Auth)
okhttp3의 Credentials.basic을 이용해 인코딩할 수 있다.
당연히, Basic Auth를 이용해 서버의 엔드포인트에 접근하려면 계정 정보가 유효해야 한다.
RestClient.kt
object RestClient {
/**
* 서버의 고정IP or 도메인
*/
private const val baseUrl = "https://some.domain.co.kr/"
/**
* baseUrl 정보로 초기화된 [Retrofit]
*/
private val retrofit = Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
/**
* [retrofit]의 [BoardService]
*/
val boardService = retrofit.create(BoardService::class.java)
}
서버를 가리키는 baseUrl 정보로 retrofit 객체를 초기화한다.
BoardService.kt
interface BoardService {
@FormUrlEncoded
@POST("some/api/v2/endpoint/posts")
fun createPost(@Header("Authorization") h1 : String,
@Field("status") status : String = "publish",
@Field("title") title : String,
@Field("content") content : String,
@Field("excerpt") excerpt : String) : Call<Post>
}
form-data Body를 POST방식으로 전송하기 위해 @FormUrlEncoded를 명시하고 @Field에 Key, Value를 포함한다. @Header(“Authorization”)은 base64 인코딩된 계정 정보(Basic Auth)를 헤더에 포함하여 전송한다.
만약, 올바른 Basic Auth라면 200 HTTP 상태 코드와 함께 JSON을 반환할 것이다.
SomeRepository.kt
class SomeRepository(val basicAuth : String) {
fun createPost(title : String, content : String, excerpt: String) : Post? {
val call = RestClient.boardService.createPost(basicAuth, title, content, excerpt)
return call.execute().body()
}
}
SomeRepository는 Basic Auth를 이용해 특정 엔드포인트에 접근할 수 있는 메소드를 포함하고 있다.
서버로 받은 JSON을 GsonConverter가 Post타입 객체로 직렬화해서 반환한다.
Reference
- Retrofit and OkHttp basic authentication
- Android Retrofit2 POST Body raw JSON
- Android| Basic Auth using retrofit2 and local API
- Basic Authentication with Retrofit
- How to send post request with basic auth in retrofit?
- Retrofit + Basic Authentication
- Retrofit 2 Authenticator and Interceptor doesn’t get called
- Retrofit2 Authorization – Global Interceptor for access token
- Retrofit2 doesn’t include the Authorization Token
- Basic Authentication not working with WP REST APIv2
- Post with REST API on WordPress.com [Error 401, not allowed]
- 401 Unauthorized with WordPress Basic Auth Plugin
- WP-API/Basic-Auth : Basic Authentication handler
- Post request with basic auth in retrofit?
- Retrofit 2 with only form-data
- 레트로핏을 이용하여 서버와 통신하자!
- [Android] Retrofit 기본 사용법