欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Android客戶端與服務(wù)器如何實(shí)現(xiàn)數(shù)據(jù)交互

這篇文章主要介紹Android客戶端與服務(wù)器如何實(shí)現(xiàn)數(shù)據(jù)交互,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

丹鳳ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

1. Android客戶端與服務(wù)器端通信方式

通信方式主要有HTTP和Socket。

  • HTTP通信:即使用HTTP協(xié)議進(jìn)行通信,工作原理是客戶端向服務(wù)器端發(fā)送一條HTTP請(qǐng)求,服務(wù)器收到之后先解析客戶端的請(qǐng)求,之后會(huì)返回?cái)?shù)據(jù)給客戶端,然后客戶端再對(duì)這些數(shù)據(jù)進(jìn)行解析和處理。HTTP連接采取的是“請(qǐng)求—響應(yīng)”方式,即在請(qǐng)求時(shí)建立連接通道,當(dāng)客戶端像服務(wù)器端發(fā)送請(qǐng)求時(shí),服務(wù)器端才能向客戶端發(fā)送數(shù)據(jù)。

  • Socket通信:Socket又稱套接字,在程序內(nèi)部提供了與外界通信的端口,即端口通信。通過建立socket連接,可為通信雙方的數(shù)據(jù)傳輸傳提供通道。Socket的主要特點(diǎn)有數(shù)據(jù)丟失率低,使用簡(jiǎn)單且易于移植。Socket類似于peer to peer的連接,一方可隨時(shí)向另一方喊話。

小結(jié):HTTP和Socket都是基于TCP協(xié)議的。使用兩種通信方式的情況是:

1.使用HTTP的情況:雙方不需要時(shí)刻保持連接在線,比如客戶端資源的獲取、文件上傳等。

2.使用UDP的情況:大部分即時(shí)通訊應(yīng)用(QQ、微信)、聊天室、蘋果APNs等。

2. Android客戶端與服務(wù)器的數(shù)據(jù)交互方式

主要有三種:

  • 數(shù)據(jù)流

從web服務(wù)器響應(yīng)到手機(jī)終端的數(shù)據(jù) 一般打包在一個(gè)字節(jié)數(shù)組中,這個(gè)字節(jié)數(shù)據(jù)中包含了不同的數(shù)據(jù)類型,客端端采取Java數(shù)據(jù)流和過慮流的方式從字節(jié)數(shù)組中取出各種類型的數(shù)據(jù)。

這種交互方式我在學(xué)習(xí)Android之初用過,實(shí)際項(xiàng)目中并沒有發(fā)現(xiàn)哪家公司在用。這種方式了擴(kuò)展了Android平臺(tái)在訪問Web服務(wù)器進(jìn)行交互時(shí)的解析數(shù)據(jù)能力,僅供研究學(xué)習(xí)。

  • XML

Webservice的標(biāo)準(zhǔn)數(shù)據(jù)格式。

  • Protocol Buffers

Protocol Buffers 是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,支持跨平臺(tái)。它很適合做數(shù)據(jù)存儲(chǔ)或 RPC 數(shù)據(jù)交換格式。比 JSON 最大的優(yōu)點(diǎn)就是傳輸?shù)臅r(shí)候數(shù)據(jù)體積可以壓縮很小,傳輸效率比較高。本人在這個(gè)在項(xiàng)目中沒有用到過。

  • JSON

JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。 易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。毫無疑問,大家最常用。

本文重點(diǎn)會(huì)介紹關(guān)于json數(shù)據(jù)格式 的常用格式。

json數(shù)據(jù)格式 的采用,根據(jù)業(yè)務(wù)情況,一般是團(tuán)隊(duì)中的共識(shí)。技術(shù)的迭代更新,到后期基本都會(huì)考慮多個(gè)平臺(tái)的通用性、可移植性和可讀性。比如 我們開發(fā)團(tuán)隊(duì),有移動(dòng)端開發(fā)(Android、iOS)、前端開發(fā)(H5開發(fā))和后臺(tái)開發(fā)(golang開發(fā))。

關(guān)于服務(wù)器的開發(fā)規(guī)范,我們先來了解一下。

服務(wù)器開發(fā)規(guī)范 我們采用的是 RESTful,RESTful是目前最流流行的 API設(shè)計(jì)規(guī)范,用于web數(shù)據(jù)接口的設(shè)計(jì)。

3. 為什么要使?RESTful API

  • ?面向資源(URI),具有解釋性;

  • 行為(GET / POST / PUT / PATCH / DELETE)與資源(URI)分離,更更加輕量量;

  • 數(shù)據(jù)描述簡(jiǎn)單,使?用JSON、XML、Protocol Buffers即可全覆蓋,主要使用JSON;

它的核心原則是定義用少量方法就能操作的命名資源。資源和方法可視為API的名詞和動(dòng)詞。

4. http請(qǐng)求方式

  • GET :讀取(Read)

  • POST :新建(Create)

  • PUT :更新(Update),通常是全部更更新

  • PATCH :更新(Update),通常是部分更更新

  • DELETE :刪除(Delete)

項(xiàng)目搭建之始,客戶端和服務(wù)器一般用 Get 和Post的方式來交互,隨著業(yè)務(wù)的演進(jìn)和技術(shù)的規(guī)范迭代,到后期我們都得按規(guī)范來。于是 我們采用了上述幾種方式來設(shè)計(jì)服務(wù)器接口,相應(yīng)地,移動(dòng)端的請(qǐng)求方式也得與之對(duì)應(yīng)。

至此,不在贅述RESTful API的設(shè)計(jì)規(guī)范,可自行百度了解更多。

5. Json交互數(shù)據(jù)類型實(shí)際中的運(yùn)用

接口的數(shù)據(jù)一般都采用JSON格式進(jìn)行傳輸,不過,需要注意的是,JSON的值只有六種數(shù)據(jù)類型:

  • Number:整數(shù)或浮點(diǎn)數(shù)

  • String:字符串

  • Boolean:true 或 false

  • Array:數(shù)組包含在方括號(hào)[]中

  • Object:對(duì)象包含在大括號(hào){}中

  • Null:空類型

傳輸?shù)臄?shù)據(jù)類型不能超過這六種數(shù)據(jù)類型,不能用Date數(shù)據(jù)類型,不同的解析庫解析方式不同,可能會(huì)導(dǎo)致異常,如果遇到日期的數(shù)據(jù),最好的方式就是使用毫秒數(shù)表示日期。

5.1 String的數(shù)據(jù)類型

使用場(chǎng)景:如用戶退出登錄時(shí),只需要得到返回狀態(tài)和提示信息即可,不需要返回任何數(shù)據(jù)。

 {
   "code": 1000,
   "message": "成功"
  }

數(shù)據(jù)解析工具類:

abstract class BaseStringCallback: BaseCallback() {

  override fun onSuccess(data: String) {
    val responseData = JSONObject(data)
    val code = responseData.getInt("code")
    val message = responseData.getString("message")

    if (code == 1000) {
      success(message)
    } else {
      //其他狀態(tài)
    }
  }

  abstract fun success(msg: String)
}

調(diào)用時(shí)(偽代碼):

LogoutApi.execute(object : BaseStringCallback() {
          override fun success(msg: String) {
   //處理數(shù)據(jù)
          })

5.2 Object數(shù)據(jù)類型

識(shí)別標(biāo)示為:{}

使用場(chǎng)景:如獲取當(dāng)前用戶信息,返回owner實(shí)體類,這個(gè)類我們可以直接用Gson的工具類轉(zhuǎn)換為owner實(shí)體類。

{
   "code": 1000,
   "message": "成功",
   "resp": {
    "owner": {
     "id": 58180,
     "name": "張三",
     "idCert": "",
     "certType": 1,
     "modifier": "jun5753",
     "updateTime": 1567127656436
    },
   }
  }

Json數(shù)據(jù)轉(zhuǎn)換為實(shí)體類工具類:

abstract class BaseObjectCallback<T>(private val clazz: Class<T>) : BaseCallback() {

  override fun onSuccess(data: String) {
    val responseData = JSONObject(data)
    val code = responseData.getInt("code")
    val message = responseData.getString("message")

    if (code == 1000) {
      val disposable = Observable.just(responseData)
          .map { it.getJSONObject("resp").toString() }
          .map { JsonUtil.parseObject(it, clazz)!! }
          .applyScheduler()
          .subscribe(
              {
                success(it)
              },
              {
                //異常時(shí)處理
              })
     
    } else {
     //其他狀態(tài)時(shí)處理
    }
  }

  abstract fun success(data: T)
}

調(diào)用時(shí)(偽代碼):

LaunchApi.getOwerInfo.execute(object : BaseObjectCallback<OwnerEntity>(OwnerEntity::class.java) {  
   override fun success(data: OwnerEntity) { 
     //處理數(shù)據(jù)  
   })

5.3. Array數(shù)據(jù)類型

識(shí)別標(biāo)示為:[]

使用場(chǎng)景:如獲取聯(lián)系人列表,返回的數(shù)據(jù)是contact列表,如 ArrayList<contact >。

{
   "code": 1000,
   "message": "成功",
   "resp": {
    "contact": [
     {
      "id": 5819,
      "name": "來啦",
      "phone": "",
      "address": "哈哈哈",
      "province": "湖南省",
      "city": "長(zhǎng)沙市",
      "area": "芙蓉區(qū)",
      "modifier": "jun5753",
      "isOwner": 0,
      "updateTime": 1566461377761
     },
     {
      "id": 5835,
      "name": "小六",
      "phone": "13908258239",
      "address": "天安門",
      "province": "北京市",
      "city": "北京市",
      "area": "東城區(qū)",
      "modifier": "jun5753",
      "isOwner": 0,
      "updateTime": 1567150580553
     }
    ]
   }
  }

Json數(shù)據(jù)轉(zhuǎn)換為實(shí)體類列表工具類:

abstract class BaseArrayCallback<T>(private val clazz: Class<T>) :BaseCallback() {

  override fun onSuccess(data: String) {
    val responseData = JSONObject(data)
    val code = responseData.getInt("code")
    val message = responseData.getString("message")

    if (code == 1000) {
      val disposable = Observable.just(responseData)
          .map { it.getJSONArray("resp").toString() }
          .map { JsonUtil.parseArray(it, clazz)!! }
          .applyScheduler()
          .subscribe(
              {
                success(it)
              },
              {
                //異常時(shí)處理
              })
    } else {
  //其他狀態(tài)時(shí)處理
    }
  }
  abstract fun success(data: ArrayList<T>)
}

調(diào)用時(shí)(偽代碼):

LaunchApi.getContactList.execute(object : BaseArrayCallback<ContactEntity>(ContactEntity::class.java) {  
   override fun success(data: ArrayList<ContactEntity>) { 
     //處理數(shù)據(jù)  
   })

5.4 復(fù)雜數(shù)據(jù)格式

使用場(chǎng)景:如用戶的篩選數(shù)據(jù)需要上傳到服務(wù)器,每次進(jìn)入篩選界面時(shí)先從服務(wù)器獲取最新數(shù)據(jù)信息。

返回的篩選json數(shù)據(jù)如下所示:

{
   "code": 1000,
   "message": "成功",
   "resp": {
    "filterdata": [
     321,
     671
    ],
    
   }

此時(shí)的數(shù)據(jù) 不同于上面提到的幾種Json數(shù)據(jù)類型,返回的列表中 數(shù)據(jù)沒有key,只有value值 。并不是以鍵值對(duì)(key-value)返回的。

解析方法:

聲明實(shí)體類

class FilterEntity {

  /** 篩選的數(shù)據(jù):解析數(shù)組對(duì)象 為Int 型數(shù)據(jù) ArrayList<Int> */ 
  var filterdata = ArrayList<Int>()
}

 調(diào)用方法(偽代碼):

HomeApi.getFilterData()
        .execute(object : CJJObjectCallback<FilterEntity>(FilterEntity::class.java) {
          override fun success(data: FilterEntity) {
          //處理數(shù)據(jù)
          }
        })

當(dāng)用戶選擇篩選數(shù)據(jù)后,需要上傳到服務(wù)器,偽代碼如下:

//上傳json示例為:[0,1,2,3,4]
val filterList = ArrayList<Int>()
//添加int數(shù)據(jù)
 filterList.add(321)
 filterList.add(671)
val jsonData = JsonUtil.toJson(filterList)
//上傳服務(wù)器
 HttpTool.put(FILTER_DATA).param("data", jsonData)

//Gson轉(zhuǎn)換方法
 fun toJson(object: Any): String {
    var str = ""
    try {
      str = gson.toJson(object)
    } catch (e: Exception) {
    
    }
    return str
  }

更多地,如果想要 上傳多種數(shù)據(jù)類型,如key-value形式的數(shù)據(jù)到服務(wù)器,偽代碼如下:

//json數(shù)據(jù)示例:{"group":[22,23,24],"brand":[1,2,3,4]}

// 客戶分組篩選
val customerGroupJsonArray = ArrayList<Int>()

 val map = ArrayMap<String, ArrayList<Int>>()
  customerGroupList.forEach {
    customerGroupJsonArray.add(it.id)
   }
  map["group"] = customerGroupJsonArray

  // 品牌篩選
  val vehicleBrandJsonArray = ArrayList<Int>()
  vehicleBrandList.forEach {
    vehicleBrandJsonArray.add(it.brandId)
  }
  map["brand"] = vehicleBrandJsonArray

 //將map類型的數(shù)據(jù)轉(zhuǎn)換為json數(shù)據(jù)
  val jsonData = JsonUtil.toJson(map)

 //上傳服務(wù)器
  HttpTool.put(FILTER_DATA).param("data", jsonData)

以上是“Android客戶端與服務(wù)器如何實(shí)現(xiàn)數(shù)據(jù)交互”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁題目:Android客戶端與服務(wù)器如何實(shí)現(xiàn)數(shù)據(jù)交互
文章出自:http://aaarwkj.com/article34/igjope.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、網(wǎng)站建設(shè)、微信小程序網(wǎng)頁設(shè)計(jì)公司、企業(yè)建站、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
久久精品久久精品欧美大片| 色婷婷一区二区三区网站| 国产精品一区二区三区日本| 国产精品三级高清在线| 极品大胸美女被啪啪的高潮| 久久se精品人妻一区二区三区| 日本大片在线一区二区三区| 东京热男人的av天堂| 日韩亚洲欧洲一区二区三区| 人人狠狠综合久久亚洲| 又爽又色的日本网站| 伊人久久精品一区二区| 婷婷激情综合亚洲五月色| 亚洲日本欧美在线一区| 97视频精品免费观看| 成人爱爱视频在线免费观看| 高清在线一区二区在线| 热久久精品只有这里有| 国产美女无遮挡免费网站| 男人一插就想射的原因| 久久精品国产成人综合| 密臀精品国产一区二区| 国产日韩精品欧美综合区| 成人午夜激情四射av| 久草尤物视频在线观看| 欧美日韩另类中文字幕| 国产三级黄色大片在线免费看| 亚洲第一女人天堂av| 亚洲精品一级理论片对面| 国产大片久久午夜电影| 国产老熟女高潮精品视频网站免费| 国产午夜激情在线播放| 精品毛片久久久久久久久| 九九六热这里只有精品| 国产三级黄色片免费看| 亚洲欧美日韩综合精品久久 | av久久精品在线观看| 男女啪啪国产精品视频| 国产夫妻自拍一级黄片| 日韩在线一区中文字幕| 亚洲熟乱熟女一区二区|