[Unity]HTTP POST請求的URL陷阱

背景

Unity 5.6
官方參考手冊 2017.1

起因

項目中使用HTTP協(xié)議與服務端進行POST通信默垄,傳輸?shù)臄?shù)據(jù)格式是文本此虑。其中涉及到了base64編碼。
實際測試過程中口锭,與服務端Log對比后發(fā)現(xiàn)朦前。服務端接收到的Body內的數(shù)據(jù)與客戶端發(fā)出的有所差別。差別處在于base64編碼后常見的=變成了%3d鹃操。而巧了韭寸,=字符的URL編碼正是%3d。
那么究竟是誰那么“好心”更改了數(shù)據(jù)呢荆隘?

解決

在使用百度搜索無果后恩伺,打開了不存在的網(wǎng)站Google,輸入Unity椰拒、HTTP晶渠、POST、URLEncode等關鍵字燃观。終于尋找到了眉目
這個貼主遇到的是JSON序列化后的字符串也經(jīng)過了“更正”褒脯,盡管與我的base64問題并不完全一致,也算的上是受害伙伴了缆毁。
在回帖中番川,一位外國友人針對Unity的HTTP通信細節(jié)進行了詳細講解。

外國友人吐槽

意思就是說脊框,Unity的UnityWebRequest API會對POST方式中傳輸?shù)臄?shù)據(jù)進行內部的URL編碼颁督。
而解決方法則是,使用UnityWebRequest的PUT方式缚陷,(該方式不會對其進行URL編碼适篙,傳輸?shù)氖荝awData)。在這之后手動將其傳輸方式更改為POST(如果你的服務端已制定用POST方式獲取數(shù)據(jù)的話)箫爷。

用偽代碼來說嚷节,就是:

//通過PUT方式構造HTTP請求
    byte[] myData = System.Text.Encoding.UTF8.GetBytes("This is some test data");
    UnityWebRequest www = UnityWebRequest.Put("http://www.my-server.com/upload", myData);
//構造好后,手動將請求方式更改為POST
    www.method = UnityWebRequest.kHttpVerbPOST;
//常規(guī)的發(fā)送虎锚,接收操作
    yield return www.Send();
    if(www.isError) {
      Debug.Log(www.error);
    }
    else {
      Debug.Log("Upload complete!");
    }

這樣便可解決題設問題了硫痰。

Another Solution

在方才引用的帖子中,還有一位外國友人提出了另一種異曲同工的方案窜护。

另外的方案

這種UnityWebRequest的構造方式效斑,屬于Unity所說的the Low-Level API (LLAPI),是更底層的柱徙、可定制化的API缓屠。它為開發(fā)者提供了對上傳的數(shù)據(jù)體奇昙,HTTP請求的Header,下載的數(shù)據(jù)處理等更細粒度的控制敌完。
而上述代碼的UnityWebRequest.Put抑或UnityWebRequest.Post則是HLAPI储耐,只此一句便實現(xiàn)了URL的指定、請求方式的制定滨溉、Header和Body的構建什湘。這也是它對Body中的數(shù)據(jù)擅自進行URL編碼的根源。
圖中代碼需要對Body中的數(shù)據(jù)進行手動填充晦攒,自然也就解決了題設的問題了闽撤。

Unity官方UnityWebRequest介紹

后記

Unity客戶端如果通過HTTP協(xié)議與服務端通信,采用的方案大致有三種:

  1. HttpWebRequest(C#原生脯颜,聽說使用很復雜)
  2. WWW
  3. UnityWebRequest

后兩種都是Unity實現(xiàn)封裝的API哟旗,而WWW由于在下載AssetBundle時的內存占用兩倍的問題,已被官方擯棄伐脖,轉而推薦使用新的UnityWebRequest热幔。

在受問題阻擾的過程中,我曾嘗試使用WWW的POST方式來進行通信讼庇。結果證明,WWW同樣對Body內的數(shù)據(jù)進行了URL編碼近尚。

也許WWW同樣有LLAPI可以對其進行更精細的掌控(未查證)蠕啄,然而由于UnityWebRequest是官方推薦的新方式,在此決定不再細究WWW戈锻。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末歼跟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子格遭,更是在濱河造成了極大的恐慌哈街,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拒迅,死亡現(xiàn)場離奇詭異骚秦,居然都是意外死亡,警方通過查閱死者的電腦和手機璧微,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門作箍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人前硫,你說我怎么就攤上這事胞得。” “怎么了屹电?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵阶剑,是天一觀的道長跃巡。 經(jīng)常有香客問我,道長牧愁,這世上最難降的妖魔是什么瓷炮? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮递宅,結果婚禮上娘香,老公的妹妹穿的比我還像新娘。我一直安慰自己办龄,他們只是感情好烘绽,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俐填,像睡著了一般安接。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上英融,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天盏檐,我揣著相機與錄音,去河邊找鬼驶悟。 笑死胡野,一個胖子當著我的面吹牛,可吹牛的內容都是我干的痕鳍。 我是一名探鬼主播硫豆,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笼呆!你這毒婦竟也來了熊响?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤诗赌,失蹤者是張志新(化名)和其女友劉穎汗茄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铭若,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡洪碳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奥喻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偶宫。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖环鲤,靈堂內的尸體忽然破棺而出纯趋,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布吵冒,位于F島的核電站纯命,受9級特大地震影響,放射性物質發(fā)生泄漏痹栖。R本人自食惡果不足惜亿汞,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望揪阿。 院中可真熱鬧疗我,春花似錦、人聲如沸南捂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溺健。三九已至麦牺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鞭缭,已是汗流浹背剖膳。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岭辣,地道東北人吱晒。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像易结,于是被迫代替她去往敵國和親枕荞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內容