Android端使用Retrofit2+OkHttp3+FastJson快速构建前后端完全分离项目

Hello,大家好,有一段时间没更新博客了,因为最近有点忙。话不多说,切入正题!

  之前自己写的一个Android项目,但是这个项目架构并不是很好,项目各模块的依赖性很强,尤其是数据和界面这块,所以我想把前后端分离的概念应用到本项目中。

  项目后端使用SSM框架开发数据接口,然后Android端使用Retrofit2+OkHttp3解析json,但是就在这个过程中,发生了一个让我很费解的bug。本片博文主要来记录一下这个bug,希望能帮助到大家。

  一、后端JSON返回格式

        

这是后端返回的JSON格式,很标准

二、Android端解析JSON

        问题就发生在解析数据的时候,之前我用Gson解析的时候,Gson一直报JSON语法错误,无法解析的异常,然后从网上找了很多解决方法,尝试以后发现都不可以。

        后来想到SSM框架默认使用的Jackson来处理Json,然后我就想在Android里面也用Jackson,但是却发现Android没有提供Jackson的convert,需要自己去写,然后果断pass。

        最后我想到在我一个J2EE项目里面,我用的是FastJson来处理JSON,然后从网上找到了这方面的方法,在Android里面集成了FastJson,然后写了一行代码就搞定了这个bug。代码奉上:

Android依赖:

解析JSON的代码:

这里有一个坑,不知道是不是Retrofit2的bug,就是在baseUrl里面填写接口地址的时候,如果把整个地址放进去,Retrofit解析的时候只会解析到域名结束,最终返回一个网页,并不是返回的json数据,解决这个问题,我们要在Android的Service层去处理,拼接这个接口地址:

      第一:在baseUrl处填写接口地址的host地址:

      第二:在Android的Service层通过请求注解填写剩余接口地址的详细部分:

这样,Retrofit在解析的时候就会自动拼接接口地址,从而返回正确的Json数据

最终这个问题还是解决了,花费了我很长时间,如果你也想这样演进你的项目,相信本篇博文会帮助到你,欢迎大家留言评论,谢谢!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用RxJava2 + Retrofit2 + OKHttp进行POST请求,可以按照以下步骤进行: 1. 添加依赖 在项目的build.gradle文件中添加以下依赖: ``` dependencies { implementation 'io.reactivex.rxjava2:rxjava:2.2.19' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.1' } ``` 2. 创建Service接口 创建一个接口,用于定义POST请求的方法。例如: ``` public interface ApiService { @POST("login") Observable<LoginResponse> login(@Body LoginRequest request); } ``` 3. 创建Retrofit对象 在Application类或其他初始化类中,创建Retrofit对象: ``` public class MyApp extends Application { private static ApiService apiService; @Override public void onCreate() { super.onCreate(); // 创建OkHttpClient对象 OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .build(); // 创建Retrofit对象 Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://example.com/api/") .client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); apiService = retrofit.create(ApiService.class); } public static ApiService getApiService() { return apiService; } } ``` 4. 发起POST请求 在需要发起POST请求的地方,可以使用以下代码: ``` LoginRequest request = new LoginRequest(); request.setUsername("admin"); request.setPassword("123456"); MyApp.getApiService().login(request) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<LoginResponse>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(LoginResponse response) { // 处理响应数据 } @Override public void onError(Throwable e) { // 处理异常 } @Override public void onComplete() { } }); ``` 上述代码中,我们首先创建了一个LoginRequest对象,用于存储要发送的数据。然后调用MyApp.getApiService().login(request)方法,发起POST请求。在这里,我们使用了RxJava2的Observable对象,将请求结果封装为一个可观察对象。使用subscribeOn(Schedulers.io())指定在IO线程中进行网络请求,使用observeOn(AndroidSchedulers.mainThread())指定在主线程中处理响应。最后通过subscribe方法订阅请求结果,处理响应数据或异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Steafan_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值