{
"id": 3432266,
"node_id": "MDEwOlJlcG9zaXRvcnkzNDMyMjY2",
"name": "kotlin",
"full_name": "JetBrains/kotlin",
"private": false,
"owner": {
"login": "JetBrains",
"id": 878437,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjg3ODQzNw==",
"avatar_url": "https://avatars2.githubusercontent.com/u/878437?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/JetBrains",
"html_url": "https://github.com/JetBrains",
"followers_url": "https://api.github.com/users/JetBrains/followers",
"following_url": "https://api.github.com/users/JetBrains/following{/other_user}",
"gists_url": "https://api.github.com/users/JetBrains/gists{/gist_id}",
"starred_url": "https://api.github.com/users/JetBrains/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/JetBrains/subscriptions",
"organizations_url": "https://api.github.com/users/JetBrains/orgs",
"repos_url": "https://api.github.com/users/JetBrains/repos",
"events_url": "https://api.github.com/users/JetBrains/events{/privacy}",
"received_events_url": "https://api.github.com/users/JetBrains/received_events",
"type": "Organization",
"site_admin": false
},
"html_url": "https://github.com/JetBrains/kotlin",
"description": "The Kotlin Programming Language",
"fork": false,
"url": "https://api.github.com/repos/JetBrains/kotlin",
"forks_url": "https://api.github.com/repos/JetBrains/kotlin/forks",
"keys_url": "https://api.github.com/repos/JetBrains/kotlin/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/JetBrains/kotlin/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/JetBrains/kotlin/teams",
"hooks_url": "https://api.github.com/repos/JetBrains/kotlin/hooks",
"issue_events_url": "https://api.github.com/repos/JetBrains/kotlin/issues/events{/number}",
"events_url": "https://api.github.com/repos/JetBrains/kotlin/events",
"assignees_url": "https://api.github.com/repos/JetBrains/kotlin/assignees{/user}",
"branches_url": "https://api.github.com/repos/JetBrains/kotlin/branches{/branch}",
"tags_url": "https://api.github.com/repos/JetBrains/kotlin/tags",
"blobs_url": "https://api.github.com/repos/JetBrains/kotlin/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/JetBrains/kotlin/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/JetBrains/kotlin/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/JetBrains/kotlin/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/JetBrains/kotlin/statuses/{sha}",
"languages_url": "https://api.github.com/repos/JetBrains/kotlin/languages",
"stargazers_url": "https://api.github.com/repos/JetBrains/kotlin/stargazers",
"contributors_url": "https://api.github.com/repos/JetBrains/kotlin/contributors",
"subscribers_url": "https://api.github.com/repos/JetBrains/kotlin/subscribers",
"subscription_url": "https://api.github.com/repos/JetBrains/kotlin/subscription",
"commits_url": "https://api.github.com/repos/JetBrains/kotlin/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/JetBrains/kotlin/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/JetBrains/kotlin/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/JetBrains/kotlin/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/JetBrains/kotlin/contents/{+path}",
"compare_url": "https://api.github.com/repos/JetBrains/kotlin/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/JetBrains/kotlin/merges",
"archive_url": "https://api.github.com/repos/JetBrains/kotlin/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/JetBrains/kotlin/downloads",
"issues_url": "https://api.github.com/repos/JetBrains/kotlin/issues{/number}",
"pulls_url": "https://api.github.com/repos/JetBrains/kotlin/pulls{/number}",
"milestones_url": "https://api.github.com/repos/JetBrains/kotlin/milestones{/number}",
"notifications_url": "https://api.github.com/repos/JetBrains/kotlin/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/JetBrains/kotlin/labels{/name}",
"releases_url": "https://api.github.com/repos/JetBrains/kotlin/releases{/id}",
"deployments_url": "https://api.github.com/repos/JetBrains/kotlin/deployments",
"created_at": "2012-02-13T17:29:58Z",
"updated_at": "2020-04-11T06:41:21Z",
"pushed_at": "2020-04-11T07:33:43Z",
"git_url": "git://github.com/JetBrains/kotlin.git",
"ssh_url": "git@github.com:JetBrains/kotlin.git",
"clone_url": "https://github.com/JetBrains/kotlin.git",
"svn_url": "https://github.com/JetBrains/kotlin",
"homepage": "https://kotlinlang.org/",
"size": 684759,
"stargazers_count": 31302,
"watchers_count": 31302,
"language": "Kotlin",
"has_issues": false,
"has_projects": false,
"has_downloads": true,
"has_wiki": false,
"has_pages": true,
"forks_count": 3815,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 212,
"license": null,
"forks": 3815,
"open_issues": 212,
"watchers": 31302,
"default_branch": "master",
"temp_clone_token": null,
"organization": {
"login": "JetBrains",
"id": 878437,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjg3ODQzNw==",
"avatar_url": "https://avatars2.githubusercontent.com/u/878437?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/JetBrains",
"html_url": "https://github.com/JetBrains",
"followers_url": "https://api.github.com/users/JetBrains/followers",
"following_url": "https://api.github.com/users/JetBrains/following{/other_user}",
"gists_url": "https://api.github.com/users/JetBrains/gists{/gist_id}",
"starred_url": "https://api.github.com/users/JetBrains/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/JetBrains/subscriptions",
"organizations_url": "https://api.github.com/users/JetBrains/orgs",
"repos_url": "https://api.github.com/users/JetBrains/repos",
"events_url": "https://api.github.com/users/JetBrains/events{/privacy}",
"received_events_url": "https://api.github.com/users/JetBrains/received_events",
"type": "Organization",
"site_admin": false
},
"network_count": 3815,
"subscribers_count": 1257
}
复制代码
在项目的build.gradle中添加依赖:
implementation "com.squareup.retrofit2:retrofit:2.6.2" implementation "com.squareup.retrofit2:converter-gson:2.6.2" implementation "com.google.code.gson:gson:2.8.1" 复制代码
如图
安装IntelliJ平台插件 NewDataClassAction (by bennyhuo)
用于将Json数据转换成Kotlin中的 data class
data class (装了前面那个插件才有);
Repository ,以及上述的json数据,点击OK创建好数据在Kotlin中的模型;
完成的 Repository 如下:
//Kotlin
package imooc.chapter_4.try_retrofit
/**
* Created by tongbo on 2020-04-11
*/
data class Repository(
var id: Int,
var node_id: String,
var name: String,
var full_name: String,
var private: Boolean,
var owner: Owner,
var html_url: String,
var description: String,
var fork: Boolean,
var url: String,
var forks_url: String,
var keys_url: String,
var collaborators_url: String,
var teams_url: String,
var hooks_url: String,
var issue_events_url: String,
var events_url: String,
var assignees_url: String,
var branches_url: String,
var tags_url: String,
var blobs_url: String,
var git_tags_url: String,
var git_refs_url: String,
var trees_url: String,
var statuses_url: String,
var languages_url: String,
var stargazers_url: String,
var contributors_url: String,
var subscribers_url: String,
var subscription_url: String,
var commits_url: String,
var git_commits_url: String,
var comments_url: String,
var issue_comment_url: String,
var contents_url: String,
var compare_url: String,
var merges_url: String,
var archive_url: String,
var downloads_url: String,
var issues_url: String,
var pulls_url: String,
var milestones_url: String,
var notifications_url: String,
var labels_url: String,
var releases_url: String,
var deployments_url: String,
var created_at: String,
var updated_at: String,
var pushed_at: String,
var git_url: String,
var ssh_url: String,
var clone_url: String,
var svn_url: String,
var homepage: String,
var size: Int,
var stargazers_count: Int,
var watchers_count: Int,
var language: String,
var has_issues: Boolean,
var has_projects: Boolean,
var has_downloads: Boolean,
var has_wiki: Boolean,
var has_pages: Boolean,
var forks_count: Int,
var mirror_url: Any,
var archived: Boolean,
var disabled: Boolean,
var open_issues_count: Int,
var license: Any,
var forks: Int,
var open_issues: Int,
var watchers: Int,
var default_branch: String,
var temp_clone_token: Any,
var organization: Organization,
var network_count: Int,
var subscribers_count: Int
) {
data class Owner(
var login: String,
var id: Int,
var node_id: String,
var avatar_url: String,
var gravatar_id: String,
var url: String,
var html_url: String,
var followers_url: String,
var following_url: String,
var gists_url: String,
var starred_url: String,
var subscriptions_url: String,
var organizations_url: String,
var repos_url: String,
var events_url: String,
var received_events_url: String,
var type: String,
var site_admin: Boolean
)
data class Organization(
var login: String,
var id: Int,
var node_id: String,
var avatar_url: String,
var gravatar_id: String,
var url: String,
var html_url: String,
var followers_url: String,
var following_url: String,
var gists_url: String,
var starred_url: String,
var subscriptions_url: String,
var organizations_url: String,
var repos_url: String,
var events_url: String,
var received_events_url: String,
var type: String,
var site_admin: Boolean
)
}
复制代码
定义一个接口 GithubApi ,在接口中定义一个 getRepository 函数(方法)传入参数 owner 与 repo ,返回一个 Repository :
Retrofit blah blah blah...
//Kotlin
interface GithubApi {
@GET("/repos/{owner}/{repo}")
fun getRepository(@Path("owner") owner: String, @Path("repo") repo: String): Call<Repository>
}
复制代码
分为3个步骤进行:
Retrofit 创建 githubApi 接口实例; response ; response 内容进行处理,例如写入HTML文件。 编辑 main() 函数:
//Kotlin
fun main() {
val githubApi = Retrofit.Builder().baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(GithubApi::class.java)
val response = githubApi.getRepository("Jetbrains", "Kotlin").execute()
val repository = response.body()
if (repository == null) {
println("Error! ${response.code()} : ${response.message()}")
} else {
//TODO:将信息写入HTML文件
File("src//main//kotlin//imooc//chapter_4//try_retrofit//KotlinRepoInfo.html").writeText(
"""
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>${repository.owner.login} - ${repository.name}</title>
</head>
<body>
<h1><a href='${repository.html_url}'>${repository.owner.login} - ${repository.name}</a></h1>
<p>${repository.description}</p>
<p>Stars : ${repository.stargazers_count}</p>
<p>Folks : ${repository.forks_count}</p>
</body>
</html>
""".trimIndent()
)
}
}
复制代码
浏览器查看 src//main//kotlin//imooc//chapter_4//try_retrofit//KotlinRepoInfo.html 文件,如下图。
关于 Retrofit 的知识点,推荐大家bennyhuo的免费课程 《破解Retrofit》
略
在判断 repository == null 前, repository 变量的类型是可空的 Repository? :
在判断 repository == null 后,编译器进行了智能类型转换,变成非空的 Repository 类型:
在使用Java Api的 File 时,我们使用了 writeText() 方法,该方法是Kotlin的扩展方法:
写入HTML文件时,我们使用了rawString,及其方法 trimIndent() ,该方法帮助删除rawString中的 公共缩进 。