HarmonyOS 鸿蒙Next网络库Retrofit
HarmonyOS 鸿蒙Next网络库Retrofit
Retrofit
手动发送网络请求的方式:
HttpURLConnection OkHttp
解析Json:用Gson,JSONObject
解析XML:Pull,Sax
Retrofit允许对功能同属一类的服务器接口定义到同一个接口文件中
1.添加依赖:
implementation("com.squareup.retrofit2:retrofit:2.6.1")//自动下载了Retrofit,okHttp和Okio,Okio是OkHttp的通信基础
implementation("com.squareup.retrofit2:converter-gson:2.6.1")//自动下载了GSON转换库
- 声明网络权限,添加网络安全配置
<uses-permission android:name="android.permission.INTERNET"/>
<application
...
android:usescleartextTraffic="true" //允许明文流量传输
>
- 创建要接收的对象类
class App(val id:String,val name:String,val version:String)
- 创建接口文件,按功能+Service命名
interface AppService {
@GET ("get_data.json")//用@GET注解传入相对路径
fun getAppData(): Call<List<App>>//返回值必须声明成Retrofit内置的Call类型,并且用泛型指定把服务器返回的数据转换成什么对象
}
- 发送请求
val button =binding.getAppDataBtn
button.setOnClickListener{
//构建一个Retrofit对象
val retrofit= Retrofit.Builder()
.baseUrl("http://10.0.2.2/")//必需,指定所有Retrofit请求的根路径,这里不要用localhost
.addConverterFactory(GsonConverterFactory.create())//指定Retrofit在解析数据时使用的转换库
.build()
val appService=retrofit.create(AppService::class.java)//创建接口的动态代理对象,这样才能调用接口的方法
//调用getAppData返回一个Call<List<App>>对象,然后调用enqueue去进行网络请求
//自动回调数据切换线程,重写Callback的onResponse和onFailure
appService.getAppData().enqueue(object: Callback<List<App>>{
override fun onResponse(call: Call<List<App>>, response: Response<List<App>>) {
val list=response.body()
if(list!=null) {
for (app in list) {
Log.d("MainActivity","id is ${app.id}")
Log.d("MainActivity","name is ${app.name}")
Log.d("MainActivity","version is ${app.version}")
}
}
}
override fun onFailure(call: Call<List<App>>, t: Throwable) {
t.printStackTrace()//打印异常信息
}
})
}
处理复杂的接口地址类型
//对于接口:GET http://example.com/<page>/get_java.json
interface ExampleService {
@GET ("{page}/get_data.json")//使用{page}占位符
fun getData(@Path("page")page:Int): Call<Data>//用@Path(“page”)来声明参数,在调用getData时自动把参数传入占位符
}
对于带一系列参数的服务器接口
http://example.com/get_data.json?u=<user>&t=<token>
// 用?连接参数部分,每个参数都是用等号连接的键值对,参数之间用&隔开
interface ExampleService {
@GET ("get_data.json")
fun getData(@Query("u")user:String,@Query("t")token:String):Call<Data>
}
常见的HTTP请求: GET,POST,PUT( 修改),PATCH(修改),DELETE
删除数据
DELETE http://example.com/data/<id>
interface ExampleService {
@DELETE("data/{id}")
fun deleteData(@Path("id")id:String):Call<ResponseBody>
//使用ResponseBody作为泛型是因为:删除数据和获取数据不同,对于服务器响应的数据不关心,ResponseBody表示Retrofit可以接收任意类型的响应数据,并且不进行解析
}
提交数据
POST http://example/data/create
interface ExampleService {
@POST("data/create")
fun createData(@Body data:Data):Call<ResponseBody>//发送请求时把data转换为Json文本然后放到HTTP的body中,服务器接收到数据后,只需要解析出来即可
}
在HTTP请求的header中指定参数:
GET http://example.com/get_data.json
User-Agent:okhttp
Cache-Control:max-age=0
interface ExampleService {
@Headers ("User-Agent:okhttp","Cache-Control:max-age=0")// 静态设置header参数
@GET("get_data.json")
fun getData():Call<Data>
}
//动态指定header
interface ExampleService {
@GET("get_data.json")
fun getData(@Header(“user -Agent”)userAgent:String,
@Header(“Cache-Control”)cacheControl:String):Call<Data>
}
每次都要去创建动态代理对象太麻烦,我们可以把前面的代码封装起来,根据不同的需要传入相应的Class
object ServiceCreator {
private const val BASE_URL="http://10.0.2.2"
private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
fun<T>create(serviceClass:Class<T>):T=retrofit.create(serviceClass)
}
//调用
val appService=ServiceCreator.create(AppService::class.java)
更多关于HarmonyOS 鸿蒙Next网络库Retrofit的实战教程也可以访问 https://www.itying.com/category-93-b0.html
Retrofit在鸿蒙Next中通过ArkTS/TypeScript实现,基于装饰器提供声明式网络请求。使用@GET、@POST等注解定义API接口,底层依赖鸿蒙HTTP模块处理网络通信。需在module.json5中声明网络权限,通过ohos.net.http发起实际请求。不支持Java/Kotlin的Retrofit库,其实现与OpenHarmony的ArkUI开发范式完全适配。
更多关于HarmonyOS 鸿蒙Next网络库Retrofit的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中集成Retrofit进行网络请求是可行的,但需要注意平台适配和依赖管理。Retrofit本身基于OkHttp,而OkHttp在HarmonyOS上需要确认兼容性。以下是关键点:
-
依赖配置:确保使用HarmonyOS支持的Retrofit版本,可能需要通过华为提供的Maven仓库获取适配库。检查Gradle配置,确认依赖项与HarmonyOS SDK兼容。
-
网络权限:在
config.json
中声明网络权限,类似Android的manifest,但需遵循HarmonyOS的权限管理规范。避免使用明文流量(usesCleartextTraffic
),优先采用HTTPS。 -
接口定义:Retrofit的注解(如
@GET
、@POST
)在HarmonyOS中工作正常,但需确保路径解析与服务器一致。HarmonyOS的网络栈可能对URL处理有细微差异,测试时注意基础URL的设置。 -
回调处理:
enqueue
方法在HarmonyOS的UI线程管理中需谨慎,避免直接更新UI。建议使用HarmonyOS的TaskDispatcher或异步机制处理响应,确保线程安全。 -
数据解析:GsonConverterFactory可用,但确认Gson库与HarmonyOS无冲突。对于复杂JSON,考虑使用HarmonyOS自带的JSON解析工具作为备选。
-
封装优化:ServiceCreator的封装方式有效,但可结合HarmonyOS的依赖注入框架(如Hvigor)管理实例,提升可维护性。
总体而言,Retrofit在HarmonyOS Next上能稳定运行,但需验证库版本兼容性和网络配置细节。测试时重点关注异常处理和性能表现。