目录
- Dependencies needed
- The plan
- Find the endpoint
- Create the response object
- Create the client interface
- Create the Retrofit instance
- Create the Repository
- Collect the response
- What's next?
代码
简介
-
我已经开始了我的下一个应用程序,这是一个Twitch客户端应用。这个系列将是我创建此应用时所面临的所有笔记和问题。
-
这篇特定的博客文章将是我们基于previous blog post的信息,并使用Github 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_token
的POST
请求。我们还发现,POST请求为3个输入参数。client_id
,client_secret
和code
。我们从我的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上与我联系。