Retrofit2.0與服務(wù)端進(jìn)行交換時實際遇到的問題解決方法(自我小總結(jié)不斷跟新)

1 Post請求中文亂碼的問題

多余的話就不說了,直接上代碼檐春。

/**
一般的Post請求示例
   @FormUrlEncoded
   @POST("你的服務(wù)器地址")
    Call<xxx> xxxx(@Field("name") String name,@Field("mphone") String mphone )
**/

以上應(yīng)該是我們常用的請求方法逻淌,請求傳遞了兩個參數(shù) “name”,”mphone”,姓名和電話疟暖。如果你發(fā)現(xiàn)你所有的接口都是類似的寫法卡儒,有的接口服務(wù)器解析時中文不會亂碼有的就會(ps:我當(dāng)時遇到的時候就是這樣痊班,并且后端的人跟我說解析的方式都是一樣的邪意。兩個人都非常懵逼)。我們來看看為什么會亂碼爸黄。

1.1 出現(xiàn)亂碼的根源問題在那里

首先我們要知道
@FormUrlEncoded 這個注解到底是干嘛的欣舵。打開源碼查看我們可以發(fā)現(xiàn)擎鸠,其描述說,這個是“x-www-form-urlencoded” 提交經(jīng)過URL編碼的表單缘圈,并且說明了在進(jìn)行URL編碼??已經(jīng)進(jìn)行了UTF-8轉(zhuǎn)碼了劣光。也就是說,懷疑編碼有問題的同學(xué)可以放一放了糟把。既然不是編碼的問題绢涡,那么就是傳輸中少了什么。 通過查看OKhttp3.0的源碼我發(fā)現(xiàn)其FormBody類下面有一個final 類型的參數(shù)
private static final MediaType CONTENT_TYPE =MediaType.parse("application/x-www-form-urlencoded");
然后你通過抓包或者查看log你會發(fā)現(xiàn)你的請求頭里面的 Content_type后面跟的就是這個值遣疯,也就是說okhttp在設(shè)計的時候有沒有考慮你用中文雄可。應(yīng)為我們很多作服務(wù)端的人都知道,在提交表單數(shù)據(jù)時另锋,都是回跟上字符集(charset=UTF-8)滞项。但是okhttp沒有給你入口。就算你設(shè)置了請求的攔截器(headerInterceptor) 當(dāng)你提交表單時 Content_type 會被自動替換掉夭坪。
知道了問題的根源那么我們就來修改文判。
幸好Retrofit給了我們添加請求頭的注解,也就是說室梅,你okhttp把我攔截器李的請求頭給干掉了戏仓,那我在加一個靜態(tài)的疚宇,把你給替換掉。

/**
解決后的代碼
我知道你們只想看這里 哈哈哈哈赏殃,說一大堆
**/
   @FormUrlEncoded
   @POST("xxxx")
   @Headers("Content-Type:application/x-www-form-urlencoded; charset=utf-8")//強塞一個給你
    Call<xxx> xxxx(@Field("name") String name,@Field("mphone") String mphone )

這樣就可以告別中文亂碼的問題了敷待。知道答案后,是不是發(fā)現(xiàn)說一堆有的沒得仁热。其實遇到問題后榜揖,在尋找問題的原因才是我們成長的關(guān)鍵。

2 Retrofit 如何提交數(shù)組

  @FormUrlEncoded
  @POST("xxx")
  Call<xxxx> memberShoppingDel(@Field("carId") List<String> carId);

3 提交不確定的數(shù)量和參數(shù)名的鍵值對

 @FormUrlEncoded
  @POST("xxxx")
  Call<xxxx> xxxxx(@FieldMap Map<String,String> map);

直接將動態(tài)的鍵值對成對的放到map中提交就可以了抗蠢。
列如:

 Map<String,String> pamas=new LinkedTreeMap<>();//聲明線性集合

        for(int i=0;i<carBeans.size();i++){
            pamas.put("carList["+i+"].product.id",carBeans.get(i).getId());
            pamas.put("carList["+i+"].amount",carBeans.get(i).getCount());
            Logger.d("carList["+i+"].product.id="+carBeans.get(i).getId()+" carList["+i+"].amount="+carBeans.get(i).getCount());

        }
         Call<ResponsBase> call=INST.Apiservice.memberShoppingSaveOrUpdate(pamas);
        call.enqueue(callback);

4 直接解析Json源數(shù)據(jù)

在某些情況時我們不方便用Gson直接解析成實體類举哟,想要自己解析源json時

  @FormUrlEncoded
  @POST("member/order/charge")
  Call<ResponseBody> memberOrderCharge(@Field("orderNumber") String orderNumber,@Field("channel") String channel);

直接使用OKhttp原生的ResponseBody 作為回調(diào)類型就可以了。
然后解析時
String jsonData=new String(response.body().bytes());

5 如何提交帶參數(shù)的和文件的請求

  /**
     * 上傳圖片
     * @param parts
     * @return
     */
    @Multipart
    @POST("Upload/upImage")
    Call<ResponseT<List<String>>> upload(@PartMap Map<String, RequestBody> map, @Part() List<MultipartBody.Part> parts);
   /**
     * 上傳圖片
     * @param upload
     * @param callback
     */
    public static void upload( String upload, String id,String type,Callback<ResponseT<List<String>>> callback){
           List<String> Content_md5s = new ArrayList<>();
            List<MultipartBody.Part> parts = new ArrayList<>();
            File file = new File(upload);
            Content_md5s.add(file.getName() + ":" + FileUtil.getFileMD5(file));//添加文件名MD5
            String content_type = "image/jpeg";
            if (FileUtil.getFileType(file.getName()) == FileUtil.FILE_TYPE_FOR_PNG) {
                content_type = "image/png";
            } else if (FileUtil.getFileType(file.getName()) == FileUtil.FILE_TYPE_FOR_MP4) {
                content_type = "video/mpeg4";
            }
            RequestBody requestBody = RequestBody.create(MediaType.parse(content_type), file);

            MultipartBody.Part part = MultipartBody.Part.createFormData("image", file.getName(), requestBody);
            parts.add(part);
        Map<String,RequestBody> params = new HashMap<>();
        //以下參數(shù)是偽代碼迅矛,參數(shù)需要換成自己服務(wù)器支持的
        params.put("id", convertToRequestBody(id));
        params.put("type",convertToRequestBody(type));
        Call<ResponseT<List<String>>> call = INST.Apiservice.upload(params, parts);
        call.enqueue(callback);

    }

尾言

以上都是介紹的post 請求妨猩,因為很少用到get或者說最近沒有遇到有g(shù)et時遇到問題又或者說以前遇到過忘記了。自己小總結(jié)秽褒,避免以后走彎路壶硅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市销斟,隨后出現(xiàn)的幾起案子庐椒,更是在濱河造成了極大的恐慌,老刑警劉巖票堵,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扼睬,死亡現(xiàn)場離奇詭異,居然都是意外死亡悴势,警方通過查閱死者的電腦和手機窗宇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來特纤,“玉大人军俊,你說我怎么就攤上這事∨醮妫” “怎么了粪躬?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昔穴。 經(jīng)常有香客問我镰官,道長,這世上最難降的妖魔是什么吗货? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任泳唠,我火速辦了婚禮,結(jié)果婚禮上宙搬,老公的妹妹穿的比我還像新娘笨腥。我一直安慰自己拓哺,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布脖母。 她就那樣靜靜地躺著士鸥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谆级。 梳的紋絲不亂的頭發(fā)上烤礁,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音肥照,去河邊找鬼鸽凶。 笑死,一個胖子當(dāng)著我的面吹牛建峭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播决摧,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掌桩!你這毒婦竟也來了边锁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤斥铺,失蹤者是張志新(化名)和其女友劉穎坛善,沒想到半個月后晾蜘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡眠屎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年剔交,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片改衩。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡岖常,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出燎字,到底是詐尸還是另有隱情腥椒,我是刑警寧澤阿宅,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站笼蛛,受9級特大地震影響洒放,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滨砍,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一往湿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惋戏,春花似錦领追、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舔亭,卻和暖如春些膨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钦铺。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工订雾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矛洞。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓洼哎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沼本。 傳聞我的和親對象是個殘疾皇子噩峦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)擅威,斷路器壕探,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,790評論 25 707
  • 編碼問題一直困擾著開發(fā)人員,尤其在 Java 中更加明顯郊丛,因為 Java 是跨平臺語言李请,不同平臺之間編碼之間的切換...
    x360閱讀 2,470評論 1 20
  • 一場從沈陽到長春之間的奔波,意外地邂逅了九月的月亮厉熟。雖然還未到十五导盅,但蜜汁一樣的秋月似乎有特殊的治愈功能,就那樣柔...
    元初閱讀 324評論 0 0
  • 日精進(jìn):對夢想的執(zhí)著是好事揍瑟,但如果獨自沉浸在自己的世界里閉門造車白翻,完全不理會外界的變化與需求,那做出來的結(jié)果也只能...
    胡玉梅閱讀 131評論 0 0