iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android中Retrofit 2.0如何使用JSON进行数据交互
  • 289
分享到

Android中Retrofit 2.0如何使用JSON进行数据交互

retrofitjson 2023-05-30 21:05:58 289人浏览 安东尼
摘要

这篇文章主要介绍了Android中Retrofit 2.0如何使用JSON进行数据交互,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。之前使用Retrofit都是将jsON串转

这篇文章主要介绍了Android中Retrofit 2.0如何使用JSON进行数据交互,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

之前使用Retrofit都是将jsON串转化为POJO对象,针对不同的业务协议,定义相应的接口和参数列表。但是此种方式一般用在自己内部协议基础上,具体大的项目中,有些第三方的集成功能,一般都采用统一的方式即请求JSON和回应JSON进行数据交互,不可能每个第三方协议都会去定义与协议相应的POJO对象。

Http肯定有GET和POST方法,先定义Retrofit api的interface:

package com.hdnetworklib.network.http;import java.util.Map;import okhttp3.RequestBody;import okhttp3.ResponseBody;import retrofit2.Call;import retrofit2.http.Body;import retrofit2.http.GET;import retrofit2.http.POST;import retrofit2.http.QueryMap;import retrofit2.http.Url;public interface RetrofitServiceApi {  @POST  Call<ResponseBody> reqPost(@Url String url, @Body RequestBody requestBody);  @GET  Call<ResponseBody> reqGet(@Url String url, @QueryMap Map<String, String> options);  @GET  Call<ResponseBody> reqGet(@Url String url);}

POST方式,采用指定完整的URL,reqeustBody就是后面业务要传入的完整JSON串

GET方式,后面的options就是一个Map,业务参数键值就存在这个里面,URL里面不需要带值。

GET方式,与2不同的是没有options,这样就键值对全部带在URL里面,类似于这样的格式:http://112.124.22.238:8081/course_api/wares/hot?pageSize=1&curPage=1

接下来就是具体对业务的接口了,提供POST和GET两个请求接口调用:

package com.hdnetworklib.network.http;import android.util.Log;import java.io.IOException;import java.util.Map;import okhttp3.MediaType;import okhttp3.RequestBody;import okhttp3.ResponseBody;import retrofit2.Call;import retrofit2.Callback;import retrofit2.Response;import retrofit2.Retrofit;import retrofit2.converter.gson.GsonConverterFactory;public class HttpClient {  private static final String TAG = "HttpClient";  private static volatile HttpClient instance;  private HttpClient() {  }  public static HttpClient getInstance() {    if (instance == null) {      synchronized (HttpClient.class) {        if (instance == null) {          instance = new HttpClient();        }      }    }    return instance;  }    public void reqPostHttp(final int req_id, final String method, String url, String jsonData, final HttpCallback callback) {    Retrofit retrofit = new Retrofit.Builder()        .baseUrl("http://www.what.com/")        .addConverterFactory(GsonConverterFactory.create())        .build();    RetrofitServiceApi retrofitServiceApi = retrofit.create(RetrofitServiceApi.class);    RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonData);    Call<ResponseBody> call = retrofitServiceApi.reqPost(url, body);    call.enqueue(new Callback<ResponseBody>() {      @Override      public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {        try {          String result = response.body().string();          Log.i(TAG, "reqPostHttp onResponse: " + result);          if (callback != null) {            callback.onSuccess(new HttpResMsg(req_id, method, result));          }        } catch (IOException e) {          e.printStackTrace();          Log.e(TAG, "reqPostHttp onResponse exception: " + e.toString());          if (callback != null) {            callback.onError(e.toString());          }        }      }      @Override      public void onFailure(Call<ResponseBody> call, Throwable t) {        Log.e(TAG, "reqPostHttp onFailure: " + t.toString());        if (callback != null) {          callback.onError(t.toString());        }      }    });  }    public void reqGetHttp(final int req_id, final String method, String url,              Map<String, String> options, final HttpCallback callback) {    Retrofit retrofit = new Retrofit.Builder()        .baseUrl("http://www.what.com/")        .addConverterFactory(GsonConverterFactory.create())        .build();    RetrofitServiceApi retrofitServiceApi = retrofit.create(RetrofitServiceApi.class);    Call<ResponseBody> call = null;    if (options == null) {      call = retrofitServiceApi.reqGet(url);    } else {      call = retrofitServiceApi.reqGet(url, options);    }    call.enqueue(new Callback<ResponseBody>() {      @Override      public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {        try {          String result = response.body().string();          Log.i(TAG, "reqPostHttp onResponse: " + result);          if (callback != null) {            callback.onSuccess(new HttpResMsg(req_id, method, result));          }        } catch (IOException e) {          e.printStackTrace();          Log.e(TAG, "reqPostHttp onResponse exception: " + e.toString());          if (callback != null) {            callback.onError(e.toString());          }        }      }      @Override      public void onFailure(Call<ResponseBody> call, Throwable t) {        Log.e(TAG, "reqPostHttp onFailure: " + t.toString());        if (callback != null) {          callback.onError(t.toString());        }      }    });  }}

需要注意的是:

baseUrl(http://www.what.com/)

这里的这个baseUrl是我瞎掰的一个地址,因为Retrofit的限制:如果baseUrl不是以 / 结尾就会报异常:

Caused by: java.lang.IllegalArgumentException: baseUrl must end in /

当我们需要完整的指定URL的时候,特别是上面列出的第二种GET方式,我们的URL是http://112.124.22.238:8081/course_api/wares/hot?pageSize=1&curPage=1,如果我们直接通过接口传参把这个URL直接传入baseUrl中,如下(注意最后没有/结尾):

Retrofit retrofit = new Retrofit.Builder()        .baseUrl("http://112.124.22.238:8081/course_api/wares/hot?pageSize=1&curPage=1")        .addConverterFactory(GsonConverterFactory.create())        .build();

这样运行时就会报错。那如果我们手工在最后面加上一个/呢?如下(注意最后有/结尾):

Retrofit retrofit = new Retrofit.Builder()        .baseUrl("http://112.124.22.238:8081/course_api/wares/hot?pageSize=1&curPage=1/")        .addConverterFactory(GsonConverterFactory.create())        .build();

这样运行时仍然报错,而且你把这个链接复制到浏览器中看看就知道肯定不行的:http://112.124.22.238:8081/course_api/wares/hot?pageSize=1&curPage=1/

我一开始遇到这个问题的时候也是第一反应去查Retrofit的官方文档和说明,或者让第三方的开发人员采用第二种GET请求方式,用一个以 / 结尾的URL,然后把URL中?后面带的那些值放到一个Map里传进来。首先官方说明和Api用法没找到,而且这个baseUrl还必须调用,其次,别的开发人员不愿意弄,好好的辛辛苦苦把URL都组装好了,没啥事让我传Map啊,肯定也不行。后面在这里找到了答案:https://stackoverflow.com/questions/36736854/retrofit2-how-do-i-put-the-at-the-end-of-the-dynamic-baseurl

Android中Retrofit 2.0如何使用JSON进行数据交互

Android中Retrofit 2.0如何使用JSON进行数据交互

所以既然你后面会完整指定URL,那么一开始的baseUrl就无关紧要,随便写一个以/结尾的Http地址就可以了。

剩下的的就是回调和消息的组装了,各位可以根据自己的业务需求进行组装和调整,我这里就只贴出代码不做过多解析了。

回调接口:

package com.hdnetworklib.network.http;public interface HttpCallback {  void onSuccess(HttpResMsg httpResMsg);  void onError(String errORMsg);}

消息结构的组装:

package com.hdnetworklib.network.http;public class HttpResMsg {  private Integer req_id;  private String method;  private String data;  public HttpResMsg() {  }  public HttpResMsg(int req_id, String method, String data) {    this.req_id = req_id;    this.method = method;    this.data = data;  }  public Integer getReq_id() {    return req_id;  }  public void setReq_id(Integer req_id) {    this.req_id = req_id;  }  public String getMethod() {    return method;  }  public void setMethod(String method) {    this.method = method;  }  public String getData() {    return data;  }  public void setData(String data) {    this.data = data;  }}

感谢你能够认真阅读完这篇文章,希望小编分享的“Android中Retrofit 2.0如何使用JSON进行数据交互”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Android中Retrofit 2.0如何使用JSON进行数据交互

本文链接: https://www.lsjlt.com/news/221454.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android中Retrofit 2.0如何使用JSON进行数据交互
    这篇文章主要介绍了Android中Retrofit 2.0如何使用JSON进行数据交互,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。之前使用Retrofit都是将JSON串转...
    99+
    2023-05-30
    retrofit json
  • 使用springMVC如何实现与json数据进行交互
    使用springMVC如何实现与json数据进行交互?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前台代码:function channel(){ //先获取选中的值 ...
    99+
    2023-05-31
    springmvc json
  • Android如何通过Retrofit提交Json格式数据
    本文将介绍如何通过retrofit库post一串json格式的数据。首先post的json数据格式如下:{ "Id": "string", "DeviceId": "string", "Name": "string", "SumDistan...
    99+
    2023-05-30
    retrofit json roi
  • 如何使用PHP7与数据库进行交互
    PHP7是一种流行的编程语言,用于开发Web应用程序。数据库是Web应用程序的重要组成部分。在这篇文章中,我们将讨论如何使用PHP7与数据库进行交互。PHP7与MySQL数据库交互MySQL是一种常见的关系型数据库管理系统。PHP7可以通过...
    99+
    2023-05-14
  • Android应用中的webview怎么与JavaScript进行数据交互
    本篇文章为大家展示了Android应用中的webview怎么与JavaScript进行数据交互,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先需要初始化WebView以及设置支持JavaScrip...
    99+
    2023-05-31
    webview javascript android
  • 如何进行C++与数据库的交互?
    在当今信息化时代,应用程序和数据库的交互不仅仅是一个常见的问题,而且是一个必要的问题。C++作为一种高级编程语言,被广泛应用于各种程序开发中。那么如何使用C++与数据库进行交互呢?本文将向您介绍,C++与数据库的交互需要哪些步骤以及基本原理...
    99+
    2023-11-03
    SQL语句执行 C++数据库连接 数据库操作API
  • PHP如何与Git中的大数据进行交互?
    PHP是一种流行的服务器端编程语言,而Git则是一种强大的版本控制工具。在现代软件开发中,Git已成为开发团队中不可或缺的一部分,特别是在处理大量数据时。但是,如何在PHP应用程序中与Git中的大数据进行交互呢? 在本文中,我们将介绍如何使...
    99+
    2023-10-19
    响应 git 大数据
  • golang中如何进行数据和json的相互转换
    这篇文章主要讲解了“golang中如何进行数据和json的相互转换”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang中如何进行数据和json的相互转换”吧!一、什么是 JSONJSO...
    99+
    2023-07-05
  • 怎么使用PHP7与数据库进行交互
    本篇内容介绍了“怎么使用PHP7与数据库进行交互”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PHP7与MySQL数据库交互MySQL是一种...
    99+
    2023-07-05
  • 如何在Android应用中对json数据进行解析
    这篇文章将为大家详细讲解有关如何在Android应用中对json数据进行解析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、android自带解析 json_btn.setOnC...
    99+
    2023-05-31
    android json 中对
  • 使用Vue-axios进行数据交互的方法
    目录1、安装axios2、axios的使用3、讲一下代理proxyTable的使用1、安装axios 打开cmd命令行工具cd到项目目录输入以下命令 npm install axio...
    99+
    2024-04-02
  • PHP和NumPy:如何在数据分析中进行交互?
    数据分析作为一项重要的技能,已经成为了现代企业和组织中不可或缺的一部分。在数据分析的过程中,需要使用到不同的工具和技术,其中,PHP和NumPy是两个非常流行的工具。本文将介绍如何在数据分析中使用PHP和NumPy进行交互。 PHP和N...
    99+
    2023-07-23
    windows 大数据 numy
  • 如何实现Django与数据库进行交互
    这篇文章主要介绍如何实现Django与数据库进行交互,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1 如何创建项目数据库首先,在虚拟机数据库中建立一个与项目同名的数据库,方便管理。(django_test) ...
    99+
    2023-06-15
  • 如何通过Ajax进行Post提交Json数据
    这篇文章主要介绍了如何通过Ajax进行Post提交Json数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。js代码$.ajax({&nbs...
    99+
    2024-04-02
  • 用Ajax+PHP进行简单数据交互
    本篇内容介绍了“用Ajax+PHP进行简单数据交互”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PHP是一种创建动态交互性站点的服务器端脚本...
    99+
    2023-06-08
  • 如何用ajax来进行交互
    本篇内容介绍了“如何用ajax来进行交互”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!同步和异步同步: 指...
    99+
    2024-04-02
  • MyBatis中怎么与数据库进行交互
    在MyBatis中,与数据库进行交互主要通过配置Mapper文件和SQL语句来实现。以下是基本步骤: 配置数据源:在MyBati...
    99+
    2024-03-07
    MyBatis 数据库
  • 如何在Python中使用Pygal进行交互可视化
    这篇文章主要介绍“如何在Python中使用Pygal进行交互可视化”,在日常操作中,相信很多人在如何在Python中使用Pygal进行交互可视化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何在Python...
    99+
    2023-06-15
  • Node.js中怎么使用JSONP进行交互
    本篇内容主要讲解“Node.js中怎么使用JSONP进行交互”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中怎么使用JSONP进行交互”吧! 在...
    99+
    2024-04-02
  • 如何使用 Python 与 npm 接口进行交互?
    Python 是一种常用的编程语言,而 npm 则是一种常用的包管理器。在某些情况下,我们需要使用 Python 与 npm 接口进行交互,来实现特定的功能。本文将介绍如何使用 Python 与 npm 接口进行交互,并提供演示代码。 一、...
    99+
    2023-07-22
    响应 npm 接口
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作