91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

網絡通信第二課 HTTP報文請求數據編碼 application/x-www-form-urlencoded

發布時間:2020-10-03 21:09:06 來源:網絡 閱讀:3454 作者:fengyuzaitu 欄目:系統運維

1編碼說明

網頁中的表單使用POST方法提交時,數據內容的類型是 application/x-www-form-urlencoded,這種類型會:

 

1.字符"a"-"z""A"-"Z""0"-"9"".""-""*",和"_"都不會被編碼;

 

2.將空格轉換為加號 (+) ;

 

3.將非文本內容轉換成"%xy"的形式,xy是兩位16進制的數值;

 

4.在每個 name=value 對之間放置 & 符號。

 

*/

 

  諸如字符: / & ? @ # ; $ + = %也可以被使用,但是它們各有其特殊的用途,如果一個文件名包括了這些字符( / & ? @ # ; $ + = %)

這些字符和所有其他字符就應該被編碼。

 

 編碼過程非常簡單,任何字符只要不是ASCII碼數字,字母,或者前面提到的標點符,它們都將被轉換成字節形式,每個字節都寫成這種形式:

一個“%”后面跟著兩位16進制的數值。空格是一個特殊情況,因為它們太平常了。它除了被編碼成“%20”以外,還能編碼為一個“+”。

加號(+)本身被編碼%2B。當/ # = & ?作為名字的一部分來使用時,而不是作為URL部分之間的分隔符來使用時,它們都應該被編碼。

參考

http://www.cnblogs.com/jingzhishen/p/3506339.html

 

2 編碼實現

C++libcurl庫并沒有提供一個類似C#URLEncoder類,或者類似Javahttpclient的具體實現,,因此提供如下的案例代碼

unsigned char ToHex(unsigned char x)

{

         return  x > 9 ? x + 55 : x + 48;

}

 

unsigned char FromHex(unsigned char x)

{

         unsignedchar y;

         if(x >= 'A' && x <= 'Z') y = x - 'A' + 10;

         elseif (x >= 'a' && x <= 'z') y = x - 'a' + 10;

         elseif (x >= '0' && x <= '9') y = x - '0';

         elseassert(0);

         returny;

}

 

std::string UrlEncode(conststd::string& str)

{

         std::stringstrTemp = "";

         size_tlength = str.length();

         for(size_t i = 0; i < length; i++)

         {

                   if(isalnum((unsigned char)str[i]) ||

                            (str[i]== '-') ||

                            (str[i]== '_') ||

                            (str[i]== '.') ||

                            (str[i]== '~'))

                            strTemp+= str[i];

                   elseif (str[i] == ' ')

                            strTemp+= "+";

                   else

                   {

                            strTemp+= '%';

                            strTemp+= ToHex((unsigned char)str[i] >> 4);

                            strTemp+= ToHex((unsigned char)str[i] % 16);

                   }

         }

         returnstrTemp;

}

 

std::string UrlDecode(conststd::string& str)

{

         std::stringstrTemp = "";

         size_tlength = str.length();

         for(size_t i = 0; i < length; i++)

         {

                   if(str[i] == '+') strTemp += ' ';

                   elseif (str[i] == '%')

                   {

                            assert(i+ 2 < length);

                            unsignedchar high = FromHex((unsigned char)str[++i]);

                            unsignedchar low = FromHex((unsigned char)str[++i]);

                            strTemp+= high * 16 + low;

                   }

                   elsestrTemp += str[i];

         }

         returnstrTemp;

}

3 生產環境編碼

上面的代碼是對=&也進行了編碼,但是在實際的生產環境中,如果請求數據中攜帶的是Json格式,并且數據中使用了參數=的方式,這種情況下=&不應該被編碼,所以應該單獨拆分進行編碼,json內容進行編碼,參數鍵值不應該被編,代碼修改如下:

std::string UrlEncode(conststd::string& str)

{

         std::stringstrTemp = "";

         size_tlength = str.length();

         for(size_t i = 0; i < length; i++)

         {

                   if(isalnum((unsigned char)str[i]) ||

                            (str[i]== '-') ||

                            (str[i]== '_') ||

                            (str[i]== '.') ||

                            (str[i]== '~') ||

                            (str[i]== '&') ||

                            (str[i]== '='))

                            strTemp+= str[i];

                   elseif (str[i] == ' ')

                            strTemp+= "+";

                   else

                   {

                            strTemp+= '%';

                            strTemp+= ToHex((unsigned char)str[i] >> 4);

                            strTemp+= ToHex((unsigned char)str[i] % 16);

                   }

         }

         returnstrTemp;

}

 

std::string UrlDecode(conststd::string& str)

{

         std::stringstrTemp = "";

         size_tlength = str.length();

         for(size_t i = 0; i < length; i++)

         {

                   if(str[i] == '+') strTemp += ' ';

                   elseif (str[i] == '%')

                   {

                            assert(i+ 2 < length);

                            unsignedchar high = FromHex((unsigned char)str[++i]);

                            unsignedchar low = FromHex((unsigned char)str[++i]);

                            strTemp+= high * 16 + low;

                   }

                   elsestrTemp += str[i];

         }

         returnstrTemp;

}

 

4 restful接口編碼

application/x-www-form-urlencoded指定了發送的POST數據,要進行URL編碼,但是前面的&,=用在POST報文前面,作為參數的時候,是不需要進行編碼的,可以直接跳過。例如:

loginusername=admin&loginpassword=admin&param={JSON報文}

對于前面的兩個&&都不能進行編碼,否則Java后臺無法正常解析出POST數據。目前JSON報文里面存在一個uri:

http://192.168.0.225:8080/kms/services/rest/dataInfoService/downloadFileid=00000001/temp001/097_5848300_10488&token=7a57a5a7ffffffffc1a0316369671314

里面存在&,如果沒有進行URL編碼的話,Java后臺無法正常解析出報文

因此對以前的url編碼函數進行了簡單的處理

std::string UrlEncode(const std::string&str)

{

         std::stringstrTemp = "";

         size_tlength = str.length();

         for(size_t i = 0; i < length; i++)

         {

                   /*

                   前面的&用來對多個參數鍵值進行區分,不能進行編碼,后面的&必須進行編碼

                   */

                   if(i < 50 && str[i] == '&')

                   {

                            strTemp+= str[i];

                            continue;

                   }

                   if(isalnum((unsigned char)str[i]) ||

                            (str[i]== '-') ||

                            (str[i]== '_') ||

                            (str[i]== '.') ||

                            (str[i]== '~') ||

                            (str[i]== '='))

                            strTemp+= str[i];

                   elseif (str[i] == ' ')

                            strTemp+= "+";

                   else

                   {

                            strTemp+= '%';

                            strTemp+= ToHex((unsigned char)str[i] >> 4);

                            strTemp+= ToHex((unsigned char)str[i] % 16);

                   }

         }

         returnstrTemp;

}

 

50是一個大致的數字,應該分別對json格式內容進行編碼,而不是對整一個發送報文進行編碼


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

铁岭县| 奇台县| 称多县| 奉化市| 乌拉特前旗| 安阳市| 吉安县| 庆云县| 瓦房店市| 交口县| 高台县| 西林县| 乐平市| 安达市| 舞阳县| 南漳县| 朝阳县| 广德县| 青阳县| 日照市| 缙云县| 靖安县| 汤原县| 汶上县| 承德市| 琼结县| 雅安市| 义乌市| 富蕴县| 宜城市| 涞源县| 石屏县| 桐乡市| 泽库县| 响水县| 八宿县| 枣阳市| 通海县| 杭锦旗| 新田县| 锦屏县|