【Android开发】SpringMVC后台+Rxjava+RxAndorid+Retrofit+okhttp提交json请求

目前项目使用的是json数据格式来实现移动端与后台的交互。之前使用的是android-async-http。感觉有点老了,于是试着使用Rxjava+RxAndorid+Retrofit+okhttp实现网络交互。

首先配置好文件,如下所示。注意目前测试成功下面相应的版本,其中okhttp依赖于okio。

    /**okhttp+okio+retrofit+rxjava+rxandroid*/
    implementation files('libs/okio-2.1.0.jar')
    implementation 'io.reactivex.rxjava2:rxjava:2.1.5'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

    implementation files('libs/kotlin-stdlib-1.3.11.jar')
    implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'

    //网络请求
    implementation 'com.squareup.retrofit2:retrofit:2.6.0'
    implementation 'com.squareup.okhttp3:okhttp:3.9.1'

编写Retrofit帮助类。

public class RetrofitHelper {
    private static final int DEFAULT_TIME_OUT = 5;//超时时间 5s
    private static final int DEFAULT_READ_TIME_OUT = 10;
    private Retrofit mRetrofit;
    private static RetrofitHelper instance = null;
    private Context mCntext;
   
    static private String BASE_URL=NetURL.URL_BASE;
    public static RetrofitHelper getInstance(Context context){
        if (instance == null){
            instance = new RetrofitHelper(context);
        }
        return instance;
    }





    private RetrofitHelper(Context mContext){
        this.mCntext=mContext;
        // 创建 OKHttpClient
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS);//连接超时时间
        builder.writeTimeout(DEFAULT_READ_TIME_OUT, TimeUnit.SECONDS);//写操作 超时时间
        builder.readTimeout(DEFAULT_READ_TIME_OUT, TimeUnit.SECONDS);//读操作超时时间


        // 创建Retrofit,这里有一个URL_BASE
        mRetrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.10.155:8082/")
                .client(builder.build())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //配置支持RJava2的 Observable
                .addConverterFactory(GsonConverterFactory.create()) //设置数据解析器,会将返回的数据自动转换为 对应的 class
                .build();
    }


    /**
     *  获取对应的Service
     * @param service
     * @param <T>
     * @return
     */
    public  <T> T create(Class<T> service) {
        return mRetrofit.create(service);
    }


}

网络连接部分。注意设置好头部。

public interface HttpService {
    /*上传户籍数据*/
    //需要添加头
    @Headers({"Content-Type: application/json","Accept: application/json"})
    @POST(NetURL.URL_HOLDER_UPLOAD)
    Observable<ResponseBody> UpLoadHolder(@Body RequestBody requestBody);
}

发送请求。这里使用Gson转为json格式。

findViewById(R.id.btn_upload_test).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                List<JSONObject> mapList= UpLoadDataUtils.GetAllData(entityHolderInfoDao, new Creator<EntityHolderInfo>() {
                    @Override
                    public EntityHolderInfo create() {
                        return new EntityHolderInfo();
                    }
                });

                if (mapList.size()>0){

                }

                Gson gson = new Gson();

                EntityHolderInfo entityHolderInfo=entityHolderInfoDao.loadAll().get(0);

                EntityHolderInfo holderInfo=entityHolderInfo;

                Map<String, Object> attrMaps = new HashMap<>();
                attrMaps.put("holderinfo_holderid",holderInfo.getHolderinfo_holderid());
                attrMaps.put("holderinfo_admincode",holderInfo.getHolderinfo_admincode());
                attrMaps.put("holderinfo_holdertype",holderInfo.getHolderinfo_holdertype());
                attrMaps.put("holderinfo_isprohome",holderInfo.getHolderinfo_isprohome());
                attrMaps.put("holderinfo_holderaddres",holderInfo.getHolderinfo_holderaddres());

                String jsonStr = gson.toJson(attrMaps);
                Map<String, String> params = new HashMap<>();
                params.put("json",jsonStr);


                String requestStr = gson.toJson(params);

                RequestBody requestBody=
                        RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),requestStr);
               try {
                   RetrofitHelper.getInstance(UploadActivity.this).create(HttpService.class)
                           .UpLoadHolder(requestBody)
                           .subscribeOn(Schedulers.io())
                           .observeOn(AndroidSchedulers.mainThread())
                           .subscribe(new Observer<ResponseBody>() {
                               @Override
                               public void onSubscribe(Disposable d) {
                                   int x=0;
                               }

                               @Override
                               public void onNext(ResponseBody s) {
                                   int x=0;
                               }

                               @Override
                               public void onError(Throwable e) {
                                   int x=0;
                               }

                               @Override
                               public void onComplete() {
                                   int x=0;
                               }
                           });


               }catch (Exception e){
                 e.toString();
               }
               
            }
        });

最后是SpringMVC服务后台。

    @RequestMapping(value = "holderUpload.do")
    @ResponseBody
    public Map<String,Object> holderUpload(@RequestBody String json){
        Map<String,Object> map = new LinkedHashTreeMap<>();
        Gson gson = new Gson();
        if(json != null){
            try{
                Holder holder = gson.fromJson(json,Holder.class);
                My_holderinfo holderinfo = holder.transformData();
                holderinfo.setUptime(DateUtil.nowTime());
                dongdiHolderinfoRe.saveOrUpdate(holderinfo);

                map.put("flag",true);
                map.put("data","success");
            }
            catch (DataIntegrityViolationException e){
                e.printStackTrace();
                map.put("flag",false);
                map.put("data","101");
                map.put("error",e.getRootCause().getMessage());
            }
        }
        else{
            map.put("flag",false);
            map.put("data","100");
            map.put("error","传输数据为空");
        }
        return map;
    }

数据格式。

SpringMVC接收的到的json数据。

在onNext函数中,Android接收成功返回数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yGIS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值