1、引用包
//网络请求
implementation("com.squareup.okhttp3:okhttp:4.9.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.9.0")
//gson-json字符串解析
implementation("com.google.code.gson:gson:2.8.6")
//网络请求——retrofit2 上层网络架构,基于okhttp
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.3'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
2、封装Retrofit 静态类
object HttpRetrofit {
//服务器:一 是关了防火墙 或者 二 开放对应的端口(推荐二)
// private const val baseUrl = "http://192.168.3.145:8001/api/"
private val client: OkHttpClient = OkHttpClient.Builder() //builder构建者设计模式
.connectTimeout(10, TimeUnit.SECONDS) //连接超时时间
.readTimeout(10, TimeUnit.SECONDS)//读取超时
.writeTimeout(10, TimeUnit.SECONDS)//写超时
.addInterceptor(LoggingInterceptor()) //添加自定义拦截器
//.addInterceptor(httpLoggingInterceptor) //添加内置拦截器
.build()
private val retrofit: Retrofit = Retrofit.Builder()
.client(client)
.baseUrl(ParamConfig.webApi)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())//数据转换适配器
.build()
/**
*
* */
fun <T> create(clazz: Class<T>): T {
return retrofit.create(clazz)
}
}
ParamConfig.webApi 访问WebApi的地址,例:http://172.16.1.123:8001/api/
如果在这里设置固定的,后面不好做更新
注意:这个是静态类的变量,可用于设置更改
3、定义调用.net WebApi的方法
@POST("Pda")
@FormUrlEncoded
fun getDataByPost(@Field("bjbh") bjbh: String): Call<ApiResult>
Pda 是.net WebApi控制器的名称,@POST是指访问webApi的post方法
ApiResult 类(kotlin数据类)
data class ApiResult(
val Success: Boolean,
var Message: String
)
4、.net WebApi 示例
public class PdaController : ApiController
{
// GET: api/Pda
public IEnumerable<string> Get()
{
return new string[] { "key", "无传值测试" };
}
// GET: api/Pda/5
public string Get(int id)
{
return $"传值id是:{id}";
}
// POST: api/Pda
public HttpResponseMessage Post()
{
Result result = new Result();
try
{
HttpContextBase context = (HttpContextBase)Request.Properties["MS_HttpContext"];//获取传统context
HttpRequestBase request = context.Request;//定义传统request对象
string bjbh = request.Form["bjbh"];
result.Success = true;
result.Message = $"测试传值:bjbh-{bjbh}";
}
catch (Exception ex)
{
result.Success = false;
result.Message = ex.Message;
}
string strJson = JsonConvert.SerializeObject(result);
return new HttpResponseMessage { Content = new StringContent(strJson, System.Text.Encoding.UTF8, "application/json") };
}
}
.net Result类
public class Result
{
/// <summary>
/// 是否成功
/// </summary>
public bool Success { get; set; } = true;
/// <summary>
/// 返回结果提示
/// </summary>
public string Message { get; set; } = null;
}
5、实体类通过 Retrofit 调用.net WebApi
private fun api(context: Context?) {
HttpRetrofit.create(PdaApi::class.java)
.getDataByPost( barcode.get() ?: "").enqueue(object : Callback<ApiResult> {
override fun onResponse(call: Call<ApiResult>, response: Response<ApiResult>) {
val data = response.body()
try {
barcode.set("")
when (data?.Success) {
true -> {
//通过Gson转换成数据类
val bjData =
Gson().fromJson(
data.Message,
BanJianData::class.java
)
bjbh.set(bjData.bjbh)
bjzt.set(bjData.state)
}
else -> {
bjbh.set(data?.Message)
}
}
} catch (e: Exception) {
bjbh.set(e.message)
//Log.e("Retrofit-成功后异常", e.message.toString())
}
}
override fun onFailure(call: Call<ApiResult>, t: Throwable) {
bjbh.set(t.message)
//Log.e("Retrofit", t.message ?: "unknown reason")
}
})
}