使用oauth2.0和改造与Android上的GitHub API交谈
#kotlin #android #mobile #tristan

目录

  1. Dependencies needed
  2. The plan
  3. Find the endpoint
  4. Create the response object
  5. Create the client interface
  6. Create the Retrofit instance
  7. Create the Repository
  8. Collect the response
  9. What's next?

代码

简介

  • 我已经开始了我的下一个应用程序,这是一个Twitch客户端应用。这个系列将是我创建此应用时所面临的所有笔记和问题。

  • 这篇特定的博客文章将是我们基于previous blog post的信息,并使用Gi​​thub Oauth API与Retrofit结合使用的authorization code。最终获得access token,这使我们能够代表用户向API提出请求。

依赖项需要

  • 为了正确使用改装,我们需要以下依赖性build.gradle(:app) file
 //retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.google.code.gson:gson:2.10.1'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

  • 根据您何时阅读本文,您可能需要更新依赖项。

计划

  • 改造可能会有些混乱,因此我创建了一些编号的清单,当我们与Retrofit合作时,您和我都可以使用:

1)找到端点

2)创建响应对象

3)创建客户端接口

4)创建改造实例

5)创建存储库

6)收集响应

1)找到端点

  • 我们需要做的第一件事是阅读Github's documentation并找到我们需要提出请求的端点。根据文档,我们发现端点是对https://github.com/login/oauth/access_tokenPOST请求。我们还发现,POST请求为3个输入参数。 client_idclient_secretcode。我们从我的previous tutorial那里得到的所有
  • 重要:阅读文档后,请求将带标头Accept: application/json。该标头将使请求返回JSON。如果我们不提供此标头,我们将获得一个MalformedJsonException
  • 我们还可以从文档中看到返回的JSON表单是:
{
  "access_token":"gho_16C7e42F292c6912E7710c838347Ae178B4a",
  "scope":"repo,gist",
  "token_type":"bearer"
}
  • 这也是一个重要信息,因为它决定了我们的响应对象的样子。

2)创建响应对象

  • 当我们通过Raterrofit提出请求时,响应将发送到我们的JSON应用程序(仅当我们提供ACPECT/JSON标题时)。然后,我们能够采取JSON响应并将其转换为Kotlin对象。这个过程涉及两个部分,

1)GSON Converter Factory (我们稍后会看到)

2)Kotlin数据类

  • 因此,我们可以创建一个数据类,以表示我们想要的数据:
data class AccessToken(
    @SerializedName("access_token")
    val accessToken:String,
    @SerializedName("token_type")
    val tokenType:String,
)
  • 您可以看到注释用于确定它们属于哪个JSON字段。我还想指出,这个数据类可以命名任何内容,我只是选择AccessToken,因为它听起来很合适。

3)创建客户端接口

  • 现在,我们可以创建一个界面,改造将用来将HTTP请求发送到我们所需的端点:
import retrofit2.http.POST
import retrofit2.Response
import retrofit2.http.Field
import retrofit2.http.FormUrlEncoded
import retrofit2.http.Headers

interface GitHubClient {

    @Headers("Accept: application/json")
    @FormUrlEncoded
    @POST("login/oauth/access_token/")
    suspend fun getAccessToken(
        @Field("client_id") client_id:String,
        @Field("client_secret") client_secret:String,
        @Field("code") code:String,
    ):Response<AccessToken>

}

  • 我相信代码是相当自我解释的,但是,我确实想指出我们对suspend关键字的使用。因为没有它,代码将无法使用并引发例外。另外,请注意,我们仅使用URL的一部分(端点),login/oauth/access_token/。当我们创建Retrofit实例
  • 时,我们将定义URL的底座

4)创建改造实例

  • 改造类将用于创建我们的GitHubClient的实现,并允许我们使用它来创建请求。我们还将使用GsonConverterFactory将响应转换为我们的AccessToken类。我们将创建一个类似的改造实例:
object RetrofitInstance {
    private val retrofits by lazy{
        Retrofit.Builder()
            .baseUrl("https://github.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }
    val api:GitHubClient by lazy {
        retrofits.create(GitHubClient::class.java)
    }

}

5)创建存储库

  • 现在,我们可以创建一个存储库类,该类将访问RetrofitInstance并向GitHub API提出请求。
class GitHubRepo {

    suspend fun getAuthCode(
        clientId:String,
        clientSecret:String,
        code:String
    ):Response<AccessToken>{

        return RetrofitInstance.api.getAccessToken(clientId, clientSecret, code)
    }
}

6)收集响应

  • 现在,我们可以创建一个ViewModel,并具有一种调用Githubrepo上的方法并提出请求的方法:
class HomeViewModel(
    val gitHubRepo: GitHubRepo = GitHubRepo()
): ViewModel(){

fun makeGitHubRequest(clientId:String,clientSecret:String,code:String) = viewModelScope.launch{
        val data = gitHubRepo.getAuthCode(
            clientId=clientId,
            clientSecret = clientSecret,
            code = code
        )
        if(data.isSuccessful){
            Log.d("GITHUB",data.body().toString())

        }else{
            Log.d("GITHUB", "NOT SUCCESSFUL")
        }
    }

}

  • 因此,我们应该能够看到我们的access_token,然后我们可以用来代表用户提出请求。

下一步是什么?

  • 在下一个教程中,我将清理代码,以适当的建筑格式放置。另外,我们将使用access_token代表用户提出请求,并进行一些良好的OLE时尚异常处理。

结论

  • 感谢您抽出宝贵的时间阅读我的博客文章。如果您有任何疑问或疑虑,请在下面发表评论或在Twitter上与我联系。