{"id":162,"date":"2025-10-09T09:23:51","date_gmt":"2025-10-09T00:23:51","guid":{"rendered":"https:\/\/devserver.kr\/blog\/?p=162"},"modified":"2025-10-09T09:23:51","modified_gmt":"2025-10-09T00:23:51","slug":"android-retrofit-%ec%82%ac%ec%9a%a9%eb%b0%a9%eb%b2%95","status":"publish","type":"post","link":"https:\/\/devserver.kr\/blog\/android\/android-retrofit-%ec%82%ac%ec%9a%a9%eb%b0%a9%eb%b2%95\/","title":{"rendered":"Android retrofit \uc0ac\uc6a9\ubc29\ubc95"},"content":{"rendered":"\n<div class=\"wp-block-jetpack-markdown\"><h1>Retrofit 2<\/h1>\n<p><a href=\"https:\/\/github.com\/square\/retrofit\">github : https:\/\/github.com\/square\/retrofit<\/a><\/p>\n<h2>build.gradle (app)<\/h2>\n<pre><code class=\"language-gradle\">dependencies {\n    implementation 'com.squareup.retrofit2:retrofit:2.9.0'\n    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'\n\n    \/\/ optional\n    implementation 'com.squareup.okhttp3:okhttp:3.12.0'\n    \/\/ optional\n    implementation 'com.squareup.okhttp3:logging-interceptor:3.4.2'\n\n}\n<\/code><\/pre>\n<h2>manifest<\/h2>\n<pre><code class=\"language-xml\">&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot;\/&gt;\n<\/code><\/pre>\n<h2>\ud1b5\uc2e0\uc5d0 \uc0ac\uc6a9\ub420 \ub370\uc774\ud130 \ubaa8\ub378 \uc900\ube44<\/h2>\n<p>\ubcc4\ub3c4 \ud30c\uc77c\ub85c<\/p>\n<pre><code>data json( \/\/Json\uc740 Key value\ud615\ud0dc\uc774\ub2e4. key = s, n \n    var s : String? =null,\n    var n : Int? =null\n)\n\n<\/code><\/pre>\n<p>interface \ub97c \uc791\uc131<\/p>\n<pre><code class=\"language-kotlin\">interface APIS {\n\n    @GET(&quot;\uc694\uccad url&quot;)\/\/Get Interface\n    @Headers(&quot;accept: application\/json&quot;,\n            &quot;content-type: application\/json&quot;)\n    fun get(\n    ): Call&lt;json&gt;\n\t\t\n\n    @POST(&quot;\uc694\uccad url&quot;)\/\/Post Interface\n    @Headers(&quot;accept: application\/json&quot;,\n            &quot;content-type: application\/json&quot;)\n    fun post(\n            @Body jsonparams: json\n    ): Call&lt;json&gt;\n\n     companion object {\/\/ Retrofit \uac1d\uccb4 \ucd08\uae30\ud654\n        private const val BASE_URL = &quot;\ud1b5\uc2e0\ud560 \uc8fc\uc18c&quot;\n        fun create(): APIS {\n\n            val gson : Gson = GsonBuilder().setLenient().create()\n\n            return Retrofit.Builder()\n                    .baseUrl(BASE_URL)\n                    .addConverterFactory(GsonConverterFactory.create(gson))\n                    .build()\n                    .create(APIS::class.java)\n        }\n    }\n}\n\nCall \uc5d0 \ub300\ud574\uc11c import \uc790\ub3d9 \ub728\ub294\ub370, retrofit2 \uc5d0 \uc788\ub294 \uac78\ub85c \uc120\ud0dd\ud558\uc790.\n\ninterface ThirtyFitAPI {\n    @Streaming\n    @GET\n    suspend fun downloadFile(@Url fileUrl:String): Call&lt;ResponseBody&gt;\n\n    \/\/@FormUrlEncoded\n    \/\/@Headers(&quot;accept: application\/json&quot;, &quot;content-type: application\/json&quot;)\n    @POST(&quot;kakao.php&quot;)\n    fun informSignUp(\n        @Body params: HashMap&lt;String, String&gt;,\n    ): Call&lt;ServerResponse&gt;\n\n    @POST(&quot;record.php&quot;)\n    fun informActionRecord(\n        @Body params: HashMap&lt;String, String&gt;,\n    ): Call&lt;ServerResponse&gt;\n\n    @POST(&quot;userinfo.php&quot;)\n    fun informUserInfo(\n        @Body params: HashMap&lt;String, String&gt;,\n    ): Call&lt;ServerResponse&gt;\n\n    @POST(&quot;fcm.php&quot;)\n    fun informFCMtoken(\n        @Body params: HashMap&lt;String, String&gt;,\n    ): Call&lt;ServerResponse&gt;\n\n    @POST(&quot;record.php&quot;)\n    fun informMissionRecord(\n        @Body params: HashMap&lt;String, String&gt;,\n    ): Call&lt;ServerResponse&gt;\n\n    @POST(&quot;record.php&quot;)\n    fun informRecordAT(\n        @Body params: HashMap&lt;String, String&gt;,\n    ): Call&lt;ServerResponse&gt;\n\n    @Multipart\n    @POST(&quot;upload_profile.php&quot;)\n    fun uploadProfile(\n        @Part id: MultipartBody.Part,\n        @Part file: MultipartBody.Part?): Call&lt;ServerResponse&gt;\n\n    @POST(&quot;today_progress.php&quot;)\n    fun todayProgress(\n        @Body params: HashMap&lt;String, String&gt;\n    ): Call&lt;ServerResponse&gt;\n\n    @POST(&quot;joinout.php&quot;)\n    fun informUnregister(\n        @Query(&quot;uuid&quot;) uuid: String,\n        @Query(&quot;origin&quot;) origin: Int\n    ): Call&lt;ServerResponse&gt;\n\n    @POST(&quot;app_report.php&quot;)\n    fun sendReport(\n        @Body params: HashMap&lt;String, String&gt;,\n    ): Call&lt;ServerResponse&gt;\n\n    @POST(&quot;unread_count.php&quot;)\n    fun unreadCount(\n        @Body params: HashMap&lt;String, String&gt;\n    ): Call&lt;ServerResponse&gt;\n\n    @Streaming\n    @GET\n    suspend fun downloadProfileImage(@Url fileUrl:String): Call&lt;ResponseBody&gt;\n}\n\n<\/code><\/pre>\n<pre><code class=\"language-kotlin\">data class CommModel(\n    var n: Int? = null,\n    var s: String? = null\n)\n\ndata class POST_TOKEN(\n    val msgCode: String,\n    val userUUID: String,\n    val token: String\n)\n\n\nfun sendTokenToServer(token: String) {\n        println(&quot;-------------------------------------------------- sendTokenToServer()&quot;)\n        \/\/ prepare message\n        val messageItem = POST_TOKEN(&quot;100&quot;, &quot;a100100&quot;, token)\n        val messageStr = Gson().toJson(messageItem)\n\n        println(&quot;-------------------------------------------------- $messageStr&quot;)\n\n        val api = APIS.create()\n        val data: CommModel = CommModel(0, messageStr)\n\n        api.post(data).enqueue(object : Callback&lt;CommModel&gt; {\n            override fun onResponse(call: Call&lt;CommModel&gt;, response: Response&lt;CommModel&gt;) {\n                \/\/ 200 or 404\n                if(response.isSuccessful) { \/\/ 200\n                    println(&quot;1 -------------------------------------------------- &quot; + response.body().toString())\n                    val data = response.body()\n                    val receivedN = data!!.n\n                    val receivedS = data!!.s\n\n                    if (receivedN == 0) {\n                        println(&quot;Post token success&quot;)\n                    }\n                    else {\n                        println(&quot;something wrong&quot;)\n                    }\n                }\n                else { \/\/ 404\n                    println(&quot;2 -------------------------------------------------- 404&quot;)\n                }\n            }\n\n            override fun onFailure(call: Call&lt;CommModel&gt;, t: Throwable) {\n                \/\/\n                println(&quot;3 -------------------------------------------------- onFailure()&quot;)\n            }\n        })\n    }\n<\/code><\/pre>\n<h1>retrofit \uc5d0 \ud5e4\ub354 \uc870\uc791 \ubc29\ubc95<\/h1>\n<p>\ubcf4\ud1b5 \uc544\ub798\ucc98\ub7fc retofit \uc744 \uac00\uc838\uc624\ub294\ub370,<\/p>\n<pre><code class=\"language-kotlin\">val retrofit = Retrofit.Builder()\n    .baseUrl(BASE_URL)\n    .addConverterFactory(GsonConverterFactory.create())\n    .build()\n\n<\/code><\/pre>\n<p>Interceptor \ub77c\ub294 \uac83\uc744 \ud1b5\ud574\uc11c \ud5e4\ub354\uc5d0 \uc870\uc791\uc744 \ud560 \uc218 \uc788\ub2e4.<\/p>\n<pre><code>fun getApiClient(): Retrofit {\n        return Retrofit.Builder()\n            .baseUrl(BASE_URL)\n            .client(provideOkHttpClient(AppInterceptor()))\n            .addConverterFactory(GsonConverterFactory.create())\n            .build()\n\n    }\n\n    private fun provideOkHttpClient(interceptor: AppInterceptor): OkHttpClient\n        = OkHttpClient.Builder().run {\n            addInterceptor(interceptor)\n            build()\n        }\n\n    class AppInterceptor : Interceptor {\n        @Throws(IOException::class)\n        override fun intercept(chain: Interceptor.Chain) : Response = with(chain) {\n            val newRequest = request().newBuilder()\n                .addHeader(&quot;Accept-Language&quot;, Utils.getTopLocale())\n                .build()\n            proceed(newRequest)\n        }\n    }\n<\/code><\/pre>\n<p>\uc0ac\uc6a9\ud560 \ub54c\ub294 \uc544\ub798\ucc98\ub7fc<\/p>\n<pre><code>val retrofit = ApiClient.getApiClient()\n\n        val api = retrofit.create(ThirtyFitAPI::class.java)\n        val body = HashMap&lt;String, Any&gt;()\n        body.put(&quot;eMail&quot;, eMail)\n        body.put(&quot;identifier&quot;, identifier)\n        body.put(&quot;signUpMethod&quot;, signUpMethod)\n        println(&quot;identi ${identifier}&quot;)\n        val call = api.setNotification(body)\n<\/code><\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[11,3],"tags":[],"class_list":["post-162","post","type-post","status-publish","format-standard","hentry","category-kotlin","category-android"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/posts\/162","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/comments?post=162"}],"version-history":[{"count":1,"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/posts\/162\/revisions"}],"predecessor-version":[{"id":163,"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/posts\/162\/revisions\/163"}],"wp:attachment":[{"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/media?parent=162"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/categories?post=162"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devserver.kr\/blog\/wp-json\/wp\/v2\/tags?post=162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}