Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
58 ͬ³Ç Android ¶Ë HTTPS ʵ¼ùÖ®ÂÃ
 
À´Ô´£ºÎ¢ÐŹ«ÖÚºÅmobilehub ·¢²¼ÓÚ£º 2017-8-14
  2186  次浏览      27
 

×Ô WWDC 2016 Æ»¹û´«µÝ³ö´Ó 2017 Äê 1 ÔÂÆðÇ¿ÖÆÆôÓÃÓ¦ÓóÌÐò°²È«´«ÊäЭÒ飨App Transport Security£©µÄÐźţ¬¸÷´ó³§¾ù¿ªÊ¼ÁË HTTPS »¯µÄÕ÷³Ì¡£ËäȻĿǰƻ¹û½«´Ë¼Æ»®ÑÓÆÚ£¬µ« HTTPS ЭÒéÒѾ­ÔÚ¸÷´ó³§¿ª»¨½á¹û¡£

1ǰÑÔ

HTTPS ЭÒéÊÇÒÔ SSL ЭÒéΪ»ù´¡µÄ°²È«°æ HTTP ЭÒ飬ºÃ´¦²»ÑÔ×ÔÃ÷£¬¼´Îª°²È«¡£¶ÔÓÚÓû§À´Ëµ£¬HTTPS ЭÒé²»½öÄܱ£ÕÏ×Ô¼ºµÄÒþ˽ÓëÊý¾Ý°²È«£¬Í¬Ê±Ò²½µµÍÁË¡°Ò³ÃæÐ¡µ¯´°¡±µÄÀ§ÈÅ£¬¼«´óµØÌáÉýÁËÓû§ÌåÑé¡£±¾ÎĽ«½éÉÜ 58 ͬ³Ç App ÔÚ HTTPS ¸ÄÔì·½ÃæµÄһЩ¾­Ñ飬²¢¶Ô Android ¶Ë HTTPS ʵ¼ùÖÐÓöµ½µÄÎÊÌâ½øÐÐ×ܽᡣ

2ÏîĿ׼±¸

58 ͬ³Çƽ̨ΪÁËÍÆ¶¯¸÷ÒµÎñÏß½øÐÐ HTTPS ¸ÄÔ죬ÐèÒªÌṩ¸÷¶ËµÄÍêÕû¸ÄÔì·½°¸¡£ËùÒÔ£¬ÎÒÃÇÔÚÏîĿ׼±¸½×¶Î£¬Ö÷Òª×öÁËÁ½²¿·ÖÊÂÇ飺

µ÷ÑÐ HTTPS ЭÒéÓ벿ÊðÏà¹ØÎÊÌ⣻

Êä³ö¾ßÌå¸ÄÔì·½°¸¡£

ÔÚµ÷ÑÐ HTTPS ЭÒéÓ벿ÊðÏà¹ØÎÊÌâÖ®ºó£¬¸÷¶Ë¾ùÊä³öÁËÒ»·Ý¾ßÌåµÄ¸ÄÔì·½°¸£¬ÈçÏ£º

·þÎñ¶Ë£º¶¯Ì¬ÊÊÅäÇëÇóЭÒéÍ·£¬ÏûÃðÓ²±àÂ룬ÓòÃûÉý¼¶£»

ǰ¶Ë£ºÒ³Ã澲̬·¾¶È¥µôЭÒéÍ·£»

¿Í»§¶Ë£ºÉý¼¶ Native ÍøÂç¿âÖ§³Ö HTTPS ¼° WebView Éý¼¶£¨´Ë½ö iOS ¶Ë£©£»

²âÊÔ£ºHTTPS ²âÊÔ·½·¨Óë²âÊԵ㡢ÉÏÏßÁ÷³Ì¡£

½ÓÏÂÀ´£¬±ÊÕß½«Ö÷Òª¶ÔÉÏÊö¸ÄÔì·½°¸ÖÐµÄ Android ¿Í»§¶Ëʵ¼ù¼°ÆäÉæ¼°Ô­Àí½øÐÐÏêϸ½éÉÜ£¬¶ÔÓÚ HTTPS ЭÒéÓë HTTP2 ЭÒéÔ­Àí·ÖÎö¸ÐÐËȤµÄ¶ÁÕߣ¬¿ÉÒÔÔÄÀÀ¡¶HTTPS Óë HTTP2 ЭÒé·ÖÎö¡·Á˽â¸ü¶à¡£

3¸ÄÔì Android ¶Ë HTTPS ʵ¼ù

¸ÄÔìºóµÄÏîÄ¿¼Ü¹¹Èçͼ 1 Ëùʾ£¬Ïà¶ÔÓÚ 58 ͬ³Ç App Ô­Óмܹ¹£¬Ìí¼ÓÁË OkHttp ÍøÂç¿â½øÐÐÍøÂç²ãÊÕÁ²£¬¶ø API ÇëÇó¡¢Í¼Æ¬ÇëÇó¡¢H5 Ò³Ãæ×ÊÔ´ÇëÇó×îÖÕ¾ù»áÔÚ OkHttp ´´½¨µÄÁ¬½ÓÉϽøÐÐÊý¾Ý´«Êä¡£

ͼ 1 ÏîÄ¿¼Ü¹¹Éè¼Æ

ÐèҪ˵Ã÷µÄÊÇ£¬ÕâÀïÖ®ËùÒÔÒýÈëÁË OkHttp ÍøÂç¿â£¬Ö÷ÒªÊÇÒòΪ HTTP2 ЭÒéµÄÖ§³Ö¡£

ÒòΪµ±¿¼ÂǽøÐÐ HTTPS ¸ÄÔìʱ£¬ÎÒÃÇÊ×ÏÈÏëµ½µÄÒ»¸öÎÊÌâ±ãÊÇ HTTPS ÐÔÄܵÍÏ¡£Ïà¶Ô HTTP ЭÒéÀ´Ëµ£¬HTTPS ЭÒ齨Á¢Êý¾ÝͨµÀ¸üºÄʱ£¬ÈôÖ±½Ó²¿Êðµ½ App ÖУ¬ÊƱػήµÍÊý¾Ý´«µÝµÄЧÂÊ£¬¼ä½ÓÓ°ÏìÓû§ÌåÑé¡£

HTTP2 ЭÒé±¾ÊÇΪÁ˽â¾ö HTTP/1.X ЭÒéµÄµÍЧÂʶøµ®ÉúµÄ£¬²»¹ýÔÚʵ¼ÊÓ¦ÓÃÖУ¬Ö»»áÔÚ HTTPS ЭÒéÎÕÊֽ׶νøÐÐЭÒéЭÉÌ£¬ËùÒÔ HTTP2 Ŀǰֱ½Ó¸ÄÉÆµÄÆäʵÊÇ HTTPS µÄµÍЧÂÊ¡£Îª´Ë£¬HTTP2 Ö÷ÒªÌá³öÁËÁ½´ó¸Ä½øµã£º

¶à·¸´Óá£Í¬Ò»ÓòÃûϵÄÇëÇ󣬿Éͨ¹ýͬһÌõÁ´Â·½øÐд«Ê䣬²»±Øµ¥¶À½¨Á¢Á´Â·£¬ÓÐЧ½ÚÊ¡¿ªÏú£»

ѹËõÍ·ÐÅÏ¢¡£½«Í·²¿×ֶλº´æÎªË÷Òý£¬¿Í»§¶ËÓë·þÎñ¶Ëά»¤Ë÷Òý±í£¬Í¨ÐŹý³ÌÖо¡¿ÉÄܲÉÓÃË÷Òý½øÐÐͨÐÅ£¬ÊÕµ½Ë÷Òýºó²éѯË÷Òý±í£¬²ÅÄܽâÎö³öÕæÕýµÄÍ·²¿ÐÅÏ¢¡£

Òò´Ë£¬ÎÒÃÇÔÚ Android ¶ËµÄ¾ßÌå¸ÄÔì·½°¸Ö÷ÒªÔÚÓÚ OkHttp ¿âÓëµ÷ÓÿâÖ®¼äµÄ½»»¥Óë°ü×°£¬ÆäÖУº

Volley µ×²ãÁ¬½ÓÌæ»» OkHttp£¬Ö»ÐèÒª´´½¨ OkHttpStack ÀàʵÏÖ HTTPStack ½Ó¿Ú²¢Ìæ»» HurlStack ¼´¿É£¬ÍøÉϳÉÐÍ·½°¸½Ï¶à£¬ÕâÀï²»ÔÙ׸Êö¡£

Fresco µ×²ãÁ¬½ÓÌæ»» OkHttp ¸ü¼Ó¼òµ¥£¬¹Ù·½ÒѾ­ÌṩÁË OkHttpNetworkFetcher Àֱ࣬½Óͨ¹ý ImagePipelineConfig ÉèÖà NetworkFetcher ¼´¿ÉÍê³ÉÌæ»»¡£ÔÚºóÃæµÄ¾ßÌåʵ¼ù²¿·Ö£¬»¹»á½²µ½¶Ô Fresco ¹Ù·½ÌṩµÄ OkHttpNetworkFetcher ÔÚÈ¡Ïû¼ÓÔØ²¿·ÖµÄÓÅ»¯¡£

4 ²¿Êðʵʩ

¶Ô App ½øÐÐ HTTPS ¸ÄÔìÐèÒª·þÎñ¶Ë¡¢Ç°¶Ë¡¢¿Í»§¶ËһͬÅäºÏ¿ª·¢£¬QA ½øÐÐÖÊÁ¿°Ñ¿Ø¡£Í¬Ê±£¬ÓÉÓÚ 58 ͬ³Ç App º­¸ÇÁËÖÚ¶àÒµÎñÏßÓëµÚÈý·½£¬Ã¿¸öÒµÎñÄËÖÁ½Ó¿ÚµÄ²¿Ê𶼿ÉÄÜ»á¶ÔÆäËûÒµÎñÔì³ÉÓ°Ïì¡£ËùÒÔ£¬¸÷ÒµÎñ¿ª·¢Ó벿ÊðµÄʱÐò¡¢ÕûÌå½ø¶ÈµÄ°Ñ¿ØÊÇÎÒÃÇÃæÁÙµÄ×î´óÄÑÌâ¡£

²¿Êðʵʩ²½Öè

¾­¹ýÓë¸÷ÒµÎñÏߵijä·ÖÌÖÂÛ£¬ÎÒÃÇ×îÖÕÈ·Á¢ÁËÈçÏÂʵʩ²½Ö裺

ÒÔÒµÎñÏßΪµ¥Î»½øÐзþÎñÊáÀí£¬È·¶¨²¢ÀíÇå¸÷ÒµÎñÏßµÄÒÀÀµ¹ØÏµ¡£

ÒµÎñÏß»ùÓÚÒÀÀµ¹ØÏµ½øÐиÄÔìÅÅÆÚÔ¤¹À£¬²¢×ÅÊÖ¿ª·¢¡£

58 ͬ³Ç App ƽ̨·½¼°Ê±Ö÷¶¯µØ¸ú½ø¸÷ÒµÎñÏߣ¬½â¾ö¸ÄÔìÆÚ¼äµÄ¼¼ÊõÎÊÌâÓëЭµ÷ÒµÎñÏß¼äÁªµ÷ÅäºÏµÈ¡£Í¬Ê±£¬¿ª·¢±ØÒªµÄ·çÏÕ¹æ±Ü²ßÂÔ£¨Æ©Èç½µ¼¶²ßÂÔ£©£¬ÒÔ½µµÍºóÐø»Ò¶ÈÉÏÏß·çÏÕ¡£

ÒµÎñÏßÍê³É¸ÄÔ첢ͨ¹ý²âÊÔºó£¬58 ͬ³Ç App ƽ̨·½ÐÞ¸ÄÒµÎñÏßÈë¿ÚÌø×ªÐ­Ò飬Ìṩ HTTPS Èë¿Ú½øÐлҶȲâÊÔ£¬ÈôЧ¹û·ûºÏÔ¤ÆÚ£¬ÔòÖð²½Ìá¸ß»Ò¶È²âÊÔ±ÈÀýÖ±ÖÁÈ«Á¿¡£

ʵʩעÒâÊÂÏî

ͨ¹ýÒÔÉϲ½Ö裬»ù±¾±£Ö¤ÁËÒµÎñÏß¼äÄܹ»¸ßЧ²¢Ðпª·¢£¬µ«ÔÚʵʩ¹ý³ÌÖУ¬Óм¸µãÐèÒªÌØ±ð×¢Ò⣺

ÒµÎñÏß¼äÓÉÓÚÀúÊ·ÎÊÌ⣬ÓÐЩҵÎñ´æÔÚÑÏÖØµÄ½»²æÒÀÀµÇé¿ö£¬ÐèÒª¼°Ê±Ð­µ÷ÒµÎñÏß½øÐÐÔÝʱµÄÒÀÀµ½â³ý¡£

ºÎΪ¡°ÔÝʱµÄÒÀÀµ½â³ý¡±£¿¶à¸öÒµÎñÏßÓÉÓÚ²¢ÐнøÐÐ HTTPS ¸ÄÔ죬·þÎñµÄÏ໥ÒÀÀµµ¼Öµ¥¸öÒµÎñÏßÎÞ·¨²âÊÔ¡£´Ëʱ½ø¶È½Ï¿ìµÄÒµÎñÏß¿ÉÒÔ½«ÒÀÀµµÄ·þÎñʹÓà HTTP ЭÒé´úÌæ·ÃÎÊ£¬»òͨ¹ý host ÅäÖÃÏà¹Ø·þÎñµÄ²âÊÔ»ú£¬´ýÆäËûÒµÎñÏßÍê³É²¿ÊðºóÔÙ¸Ä»Ø HTTPS ЭÒé¡£

ËäÈ»ÒÔÒµÎñÏßΪµ¥Î»½øÐв¢Ðпª·¢¿ÉÒÔ½«¿ª·¢¡¢²âÊÔµÈÁ÷³Ì·Ö·¢µ½ÒµÎñÏßÄÚ²¿Íê³É£¬µ« HTTPS ¸ÄÔìÉæ¼°µ½µÄ·þÎñÖڶ࣬¸ÄÔì³É±¾ºÜ¸ß£¬¿ÉÄÜ»áÓëÒµÎñÏßµÄÒµÎñÐèÇ󿪷¢²úÉú³åÍ»¡£Òò´Ë£¬Æ½Ì¨·½ÐèÒª¼°Ê±¸ú½øÒµÎñÏߵĽø¶È£¬¼°Ê±Í×ÉÆµØ´¦Àí×èÈûÒòËØ¡£

5HTTPS ʵ¼ùÎÊÌâ»ã×Ü

¼øÓÚ HTTPS Óû§ÌåÑé¸üºÃ£¬ÒÔ¼°¿ÉÒÔ½â¾ö HTTPS ÐÔÄÜÎÊÌâµÄÇÐʵ·½°¸£¬58 ͬ³Ç App ±ã¿ªÕ¹ÁËȫվ HTTPS »¯µÄ¸ÄÔì¡£µ±È»£¬ÔÚ¸ÄÔì¹ý³ÌÖУ¬ÎÒÃÇÒ²Óöµ½ÁËһЩÎÊÌ⣬Ö÷ÒªÓÐÒÔϼ¸Àࣺ

HTTPS µ÷ÊÔÎÊÌâ

ÐÔÄÜÎÊÌâ

»·¾³ÎÊÌâ

OkHttp ½ÓÈëÎÊÌâ

ÏÂÃæ½«¶ÔÒÔÉÏÎÊÌâ½øÐÐÒÀ´Î·ÖÎö¡£

HTTPS µ÷ÊÔÎÊÌâ

½øÐÐ HTTPS ¸ÄÔìÓöµ½µÄµÚÒ»¸öÎÊÌâ¾ÍÊÇ HTTPS ²»ºÃµ÷ÊÔ¡£µ±ÎÒÃǰó¶¨ÁË PC ×÷Ϊ´úÀí£¬Í¨¹ý Charles »ò Fiddler ץȡÇëÇóʱ£¬ËüÃǼ´³ÉΪÎÒÃǵĴúÀí·þÎñÆ÷¡£Èô²»°²×° Charles »ò Fiddler µÄÖ¤Êéµ½É豸ÉÏ£¬±ãÎÞ·¨Íê³É¶Ô´úÀí·þÎñÆ÷µÄÉí·ÝÈÏÖ¤£¬ºóÐøµÄÓ¦ÓÃÊý¾Ý´«ÊäÒ²¾ÍÎÞ´Ó̸Æð£¬Ö±½ÓµÄ±íÏÖ¼´Îª HTTPS ÇëÇóʧ°Ü¡£

Ãæ¶ÔÕâÖÖÎÊÌ⣬×î¼òµ¥µÄ·½Ê½ÊǸøÉ豸°²×°Ö¤Ê飬֮ºó±ã¿ÉÒÔµ÷ÊÔ HTTPS ÇëÇóÁË¡£µ«Ã¿Ì¨ PC µÄ´úÀíÖ¤Êé¸÷Ò죬ÈôÐèÒªÏñ HTTP ÇëÇóÒ»Ñù·½±ãµØµ÷ÊÔ£¬Ðë¶Ôÿ̨ÊÖ»ú°²×°Ã¿Ì¨ PC µÄ´úÀíÖ¤Êé¡£Õâµã¶ÔÓÚ½öÐèÒªÑéÖ¤ÇëÇóÊý¾ÝµÄ²âÊÔͬѧÀ´Ëµ±È½ÏÍ´¿à£¬Ö»ÊÇΪÁË¿´ÏÂÊý¾Ý£¬ÎªÊ²Ã´ÒªÕâôÂé·³£¿

Ôڴ˸ø³öÁ½µã¿ÉÐеĽ¨Ò飺

¿Í»§¶Ë½« HTTPS ÇëÇó½á¹û×÷ΪÈÕÖ¾Êä³ö£¬¿ª·¢Óë²âÊÔͬѧ¿ÉÒÔÕë¶ÔÈÕÖ¾·ÖÎö½Ó¿ÚÎÊÌ⣻

²ÉÓÃÀàËÆ Chuck ÏîÄ¿£¨https://github.com/jgilfelt/chuck£©µÄ˼·£¬Îª OkHttp Ìí¼Ó interceptor ÒÔÊÕ¼¯ÇëÇó½á¹û£¬²¢½«ÆäÒÔ UI ÐÎʽֱ¹ÛµØÕ¹Ê¾³öÀ´¡£

ͨ¹ýÒÔÉÏÁ½ÖÖ·½Ê½£¬¿ÉÒÔÓÐЧµØ¼ò»¯ÇëÇó½á¹ûµÄÑéÖ¤Óë²é¿´¡£ÈôÊÇÐèÒªÐÞ¸ÄÇëÇóµÄ½á¹û½øÐе÷ÊÔ¿ª·¢£¬ÊÇ·ñÊÇ HTTPS ЭÒéÒÑÎ޹ؽôÒª£¬´Ëʱ½èÖú Charles Óë Fiddler µ÷ÊÔ HTTP ½Ó¿ÚÒ²·Ç³£¼òµ¥¡£

ÐÔÄÜÎÊÌâ

HTTPS ЭÒéÐÔÄÜ½Ï HTTP ЭÒéÉԲҲÓÉ´ËÔì³ÉÁËÈõÍøÇé¿öϵÄÁ¬½Ó³¬Ê±ÎÊÌâ¡£

¶à·¸´ÓÃÌØÐÔÌáÉý HTTPS ÐÔÄÜ

HTTPS ЭÒéͨÐÅЧÂÊ½Ï HTTP ЭÒéͨÐÅЧÂʵÍÊÇÖÚËùÖÜÖªµÄÊÂʵ£¬µ± App È«ÃæÉý¼¶Îª HTTPS ʱ£¬Í¨ÐÅЧÂʵĽµµÍ»áÖ±½ÓÓ°ÏìÓû§ÌåÑé¡£ÎÒÃǾ­¹ýÏßÉÏÊý¾Ý¶Ô±È·¢ÏÖ£¬Í¨¹ý HTTPS ЭÒé·ÃÎÊ£¬ÆäºÄʱÊÇ HTTP ЭÒé·ÃÎʺÄʱµÄ 1.3-2.1 ±¶¡£

ÄÇô£¬HTTPS ¸ÃÈçºÎÌá¸ßͨÐÅЧÂÊÄØ£¿

ÔÚ½¨Á¢°²È«Í¨µÀ²¿·Ö£¬ÓÉÓÚÉæ¼°µ½Éí·ÝÈÏÖ¤ÓëËã·¨¡¢ÃÜԿЭÉÌ£¬Á½´ÎÍøÂçÍù·µÊǺÜÄÑÓÅ»¯µÄ¡£µ«ÔÚ½¨Á¢Á˰²È«Í¨µÀºó£¬ÈôÄܸ´ÓôËͨµÀ£¬ÔòºóÐøÇëÇó±ã¿É±ÜÃâÁ½´ÎÍøÂçÍù·µ¡£ËùÒÔ£¬»ùÓÚÕâÖÖ˼·£¬58 ͬ³Ç App Ö÷Òª½èÖú HTTP2£¨»ò SPDY£©Ð­ÒéµÄ¶à·¸´ÓÃÌØÐÔ£¬Ìá¸ßͨµÀʹÓÃÂÊ£¬½ø¶øÌá¸ßͨÐÅЧÂÊ¡£

ÓÉÓÚ¶à·¸´ÓÃÌØÐÔÊÇÓòÃû¼¶¸´Óã¬ËùÒÔ×îÖØÒªµÄÒ»µã±ãÊÇÊÕÁ²ÓòÃû¡£ÊÕÁ²Ð§¹ûÔ½ºÃ£¬Í¨µÀµÄ¸´ÓÃÂÊÔ½¸ß¡£Òò´Ë£¬ÎÒÃÇ¶Ô API ½Ó¿Ú¡¢Í¼Æ¬µÈ×ÊÔ´½Ó¿Ú½øÐÐÁËÓòÃûÊÕÁ²£¬¾¡¿ÉÄܵØÊÕÁ²¶à¼¶ÓòÃûÖÁ¶þ¼¶ÓòÃû¡¢ÊÕÁ²ÁãÉ¢ÓòÃûÖÁͳһÓòÃû¡£

×ÛÉÏ£¬½èÖú HTTP2£¨»ò SPDY£©Ð­ÒéµÄ¶à·¸´ÓÃÌØÐÔ£¬ÒÔ¼°¶ÔÏÖÓÐÒµÎñµÄÓòÃûÊÕÁ²½øÐÐÓÅ»¯£¬Í¨¹ýÏßÉÏÊý¾Ý¶Ô±ÈµÃ³ö£¬Æä·ÃÎʺÄʱÊÇ HTTP ЭÒé·ÃÎʺÄʱµÄ 1.2 ±¶×óÓÒ¡£

Ìá¸ßÁбíÒ³ HTTPS ͼƬ¼ÓÔØËÙ¶È

58 ͬ³Ç App ʹÓõÄͼƬ¿âÊÇ Fresco£¬ÔÚ OkHttp ½ÓÈëºó£¬ÎÒÃÇÒ²Ë³ÊÆ½« Fresco µÄ Fetcher Ìæ»»Îª OkHttp ʵÏÖ£¬ÒÔÌá¸ß HTTPS ͼƬµÄ¼ÓÔØËÙ¶È¡£µ«¹Ù·½ÌṩµÄ OkHttpNetworkFetcher È´ÈÔÓÐÓÅ»¯¿Õ¼ä¡£±ÈÈ磬OkHttpNetworkFetcher µÄ¼ÓÔØÈÎÎñÈ¡Ïû²Ù×÷ÊÇͨ¹ýµ÷Óà Call.cancel()À´ÊµÏֵġ£¾ßÌå´úÂëÈçÏ£º

//OkHttpNetworkFetcher ¶Ô Call ½øÐÐÈ¡Ïû
fetchState.getContext().addCallbacks(
new BaseProducerContextCallbacks(){
@Override
public void onCancellationRequested(){
if(Looper.myLooper()! = Looper.getMainLooper()){
call.cancel();
}else{ mCancellationExecutor.execute(new Runnable(){
@Override public void run() {
call.cancel();
}
});
}
}
});

¶Ô Call.cancel()Ö´ÐмÓÔØÈ¡Ïû²Ù×÷ºó£¬¼ÓÔØÈÔÈ»»á±»Ï̳߳ص÷ÓÃÖ´ÐУ¬Ö±µ½ RetryAndFollowInterceptor Ö´ÐÐʱ cancel ²Ù×÷²Å»áÆð×÷Óá£

Òò´Ë£¬ÎÒÃÇ¶Ô OkHttpNetworkFetcher ½øÐÐÁ˸Äд¡£ÔÚ Fresco È¡Ïû¼ÓÔØµÄ»Øµ÷ÖУ¬¶ÔͼƬ¼ÓÔØÈÎÎñ¶ÔÓ¦µÄ future ½øÐÐ cancel ²Ù×÷£¬±ã¿ÉÒÔ¼õÉÙ RetryAndFollowInterceptor ֮ǰµÄÂß¼­´¦Àí£¨Ö÷ÒªÊÇ×Ô¶¨Òå Interceptor ²¿·Ö£©¡£

¾ßÌå´úÂëʵÏÖÓë HttpUrlConnectionNetworkFetcher µÄÈ¡Ïû»Øµ÷ʵÏÖÀàËÆ¡£

HTTPS »·¾³ÎÊÌâ

¿Í»§¶ËÖ¤ÊéÑéÖ¤ÎÊÌâ

HTTPS ¸ÄÔì¹ý³ÌÖУ¬³£¼ûµÄÒ»¸öÎÊÌâ±ãÊǿͻ§¶ËÖ¤ÊéÑéÖ¤³ö´í£¬¾¿ÆäÔ­Òò£¬ÍùÍùÊÇÒòΪ£º

Ö¤Êé¹ÜÀí»ìÂÒ£¬µ¼ÖÂÏ·¢Ö¤ÊéµÄÓòÃûÓëÇëÇóÓòÃû²»·û£¬ÎÞ·¨Í¨¹ýÑéÖ¤¡£

Ö¤Êé¹ýÆÚ¡£

Ö¤ÊéÇ©·¢ CA δ±»ÄÚÖÃÓÚ¿Í»§¶Ë¡£

Ö¤ÊéÁ´²»ÍêÕû£¬ÎÞ·¨ÑéÖ¤¡£

ÔÚ´Ë£¬ÎÒÃǾßÌåÆÊÎöһϡ°CA δ±»ÄÚÖÃÓÚ¿Í»§¶Ë¡±Óë¡°Ö¤ÊéÁ´²»ÍêÕû¡±µÄÎÊÌâ¡£

Ö¤ÊéÇ©·¢ CA δ±»ÄÚÖÃÓÚ¿Í»§¶Ë¡ª¡ªÓÉÓÚ CA ÊýÁ¿Öڶ࣬ÖÊÁ¿Ò²²Î²î²»Æë£¬Ãæ¶ÔͬÑùÖÚ¶àµÄÊÖ»ú³§ÉÌÓë×Ô¶¨Òå ROM£¬ÎÞ·¨±£Ö¤ CA Äܹ»ÄÚÖõ½¿Í»§¶ËÖ¤ÊéÁбíÖУ¬ËùÒÔ CA ´æÔÚ²»±»¿Í»§¶ËÈϿɵĿÉÄÜÐÔ£¨Google Ò²»á»ùÓÚ CA ÈϿɶȽøÐÐÖ¤ÊéÁбíµÄ¸üУ©¡£Ïà¶ÔÀ´Ëµ£¬¶¥¼¶ CA µÄÉ豸¼æÈÝÐԽϺã¬ÈôÓöµ½¸ùÖ¤Êé·¾¶ÕÒ²»µ½µÄÒì³££¬¿ÉÒÔ¿¼ÂǸü»» CA£¬Ç©·¢Ö¤Êé¡£

Ö¤ÊéÁ´²»ÍêÕû£¬ÎÞ·¨ÑéÖ¤¡ª¡ªÔÚÎÕÊÖЭÒéÖУ¬·þÎñ¶Ë»áÏ·¢ Certificate ÏûÏ¢¸ø¿Í»§¶Ë£¬ÏûÏ¢ÖÐЯ´øÁËÓÉ CA Ç©·¢µÄÖ¤ÊéÓë CA Ö¤Êé¹¹³ÉµÄÖ¤ÊéÁ´¡£¿Í»§¶Ëͨ¹ýÖ¤ÊéÁ´ÐÅÏ¢£¬Öð¼¶ÏòÉÏѰÕÒ¸ùÖ¤Ê飬ÕÒµ½ºóÔÙͨ¹ý¸ùÖ¤ÊéµÄ¹«Ô¿Öð¼¶ÏòÏÂÑéÖ¤Ö¤ÊéÁ´£¬ÈôÖ¤ÊéÁ´Ñé֤ͨ¹ý£¬ÔòÉí·ÝÑéÖ¤½×¶ÎÍê³É¡£

ÌÈÈô·þÎñ¶ËֻϷ¢ÁË×Ô¼ºµÄÖ¤Êé»òÏ·¢µÄÖ¤ÊéÁ´²»×ãÒÔѰÕÒµ½¸ùÖ¤Ê飬µ¼ÖÂÑéÖ¤Á÷³Ì¶ÏÁÑ£¬ÔòÎÞ·¨Í¨¹ýÉí·ÝÑéÖ¤¡£ÕâÊÇ·þÎñ¶ËÖ¤ÊéÅäÖò¿ÊðÎÊÌ⣬Èç¹ûÖ¤ÊéÈÏ֤ʧ°Ü£¬ºÜÓпÉÄÜÊÇÕâ¸öÔ­ÒòÔì³ÉµÄ¡£

DNS ½Ù³ÖÎÊÌâ

ËäÈ»ÎÒÃDzÉÓà HTTPS Ìá¸ßÁËͨÐŰ²È«£¬µ« DNS ½Ù³ÖµÄÇé¿öÈÔÈ»ÎÞ·¨½â¾ö¡£µ±ÎÒÃÇÏ£Íû»ñÈ¡ IP µØÖ·Ê±£¬ÐèҪͨ¹ý DNS ·þÎñÆ÷½øÐвéѯ£¬Èô·ÃÎʵķþÎñÆ÷±»ÎÛȾ£¬·µ»Ø¸øÎÒÃÇ´íÎóµÄ IP µØÖ·£¬´Ëʱ±ã²úÉúÁË DNS ½Ù³ÖÎÊÌâ¡£

Ïà¶ÔÓÚ HTTP ЭÒ飬HTTPS ЭÒé DNS ½Ù³ÖµÄºó¹û¸üΪÑÏÖØ¡£ÓÚ HTTP ЭÒé¶øÑÔ£¬DNS ½Ù³Öºó»á²úÉú¼àÌýÊý¾Ý»ò²åÈëÊý¾ÝµÄ·çÏÕ£¬¶ø¹¦ÄÜ¿ÉÄܲ»ÊÜÓ°Ïì¡£µ«¶ÔÓÚ HTTPS ЭÒéÀ´Ëµ£¬DNS ½Ù³Öºó£¬·þÎñÆ÷Ï·¢Ö¤ÊéÎÞ·¨Í¨¹ý¿Í»§¶ËÈÏÖ¤£¬»òÊÇ·þÎñÆ÷¸ù±¾Ã»ÓпªÆô 443 ¶Ë¿Ú£¬¾ùÎÞ·¨½¨Á¢ HTTPS Á¬½Ó¡£

Ãæ¶Ô DNS ½Ù³ÖÇé¿ö£¬ÕâÀïÌṩÁ½ÖÖ½â¾ö·½°¸£º

Ï·¢£¨»òÄÚÖã©IP ÁÐ±í£¬Í¨¹ý DNS ½Ó¿ÚÓɿͻ§¶Ë½øÐÐ DNS ½âÎö»ò IP µØÖ·±È¶Ô£»

ÔËά¼à¿Ø»òµÚÈý·½¼à¿Ø£¬¶Ô³öÏÖ DNS ½Ù³ÖµÄÇøÓòÏòÔËÓªÉÌͶËß½â¾ö¡£

½µ¼¶²ßÂÔ

¿¼Âǵ½ HTTPS ´æÔÚÖ¤ÊéÑéÖ¤¡¢DNS ½Ù³Ö¼°´úÀí 443 먦ÆôµÈÖî¶àÎÊÌ⣬ÔÚʵ¼ù¹ý³ÌÖУ¬ÎÒÃÇÒ²Ìí¼ÓÁ˽µ¼¶²ßÂÔ¡£Æô¶¯ App ʱ£¬Í¨¹ý·þÎñ½Ó¿ÚÏ·¢ÓòÃû½µ¼¶×ֵ䣬ƩÈ磺

{"key" : [{"HTTPS://app.58.com" : "http://app.58.com"}]}

ÔÚÇëÇóǰ£¬»á½« URL Óë½µ¼¶×ֵ䯥Åä´¦Àí£¬¾­¹ýÆ¥ÅäµÄ URL ÔÙ·¢ÆðÇëÇ󣬱ÜÃâ HTTPS ¸ÄÔìÓ°ÏìÓû§¹¦ÄÜ¡£

OkHttp ½ÓÈëÎÊÌâ

OkHttp ÊÇĿǰʹÓÃ×î¹ã·ºµÄÖ§³Ö HTTP2 µÄ Android ¶Ë¿ªÔ´ÍøÂç¿â£¬ÏÂÃæ·ÖÏíÏ 58 ͬ³Ç App ÔÚ½ÓÈë OkHttp ¹ý³ÌÖÐÓöµ½µÄÎÊÌâ¡£

OkHttp Í·²¿Êý¾Ý·Ç·¨×Ö·ûÅ׳öÒì³£

OkHttp ¹¹ÔìÍ·²¿Êý¾ÝÖ÷Ҫͨ¹ý Request.Builder ¶ÔÏóµÄ add(name,value)Óë set(name,value)Á½ÖÖ·½·¨£¬¶øËüÃÇÄÚ²¿¾ù»áµ÷Óà checkNameAndValue(name,value)£¬Õâ¸ö·½·¨»á¶Ô name Óë value ·Ö±ð½øÐÐ×Ö·û¼ì²â£¬Èô×Ö·û²»ÔÚ\u001f ÖÁ\u007f Ö®¼ä£¬Ôò»áÅ׳ö IllegalArgumentException¡£

private void checkNameAndValue(String name, String value) {
if(name == null) throw new NullPointerException("name == null");
if(name.isEmpty()) throw new IllegalArgumentException("name is empty");
for(int i = 0, length = name.length(); i < length; i++) {
char c = name.charAt(i);
if (c <= '\u001f' || c >= '\u007f') {
throw new IllegalArgumentException(Util.format(
"Unexpected char %#04x at %d in header name: %s", (int) c, i, name));
}
}
if (value == null) throw new NullPointerException("value == null");
for (int i = 0, length = value.length(); i < length; i++) {
char c = value.charAt(i);
if (c <= '\u001f' || c >= '\u007f') {
throw new IllegalArgumentException(Util.format(
"Unexpected char %#04x at %d in %s value: %s", (int) c, i, name, value));
}
}
}

´Ó OkHttp µ×²ã´úÂë¿ÉÒÔ·¢ÏÖ£¬OkHttp ¶Ô×Ö·û´®ÊÇͨ¹ý UTF-8 ±àÂëµÄ£¬ÕâÀïÇ¿ÖÆ½øÐÐ×Ö·û¼ì²â£¬²ÂÏë¿ÉÄÜÊÇ»ùÓÚ¶Ô±àÂë¹æ·¶µÄ¿¼ÂÇ¡£

ΪÁ˱ÜÃâ×Ö·û¼ì²âʧ°Üµ¼ÖµÄÒì³££¬ÎÒÃÇ¿ÉÒÔͨ¹ýÆäËû API ÈÆ¹ýÕâ¸öÏÞÖÆ£º

Header Ìí¼Óͨ¹ý Headers.of ·½·¨Éú³É Headers£¬²¢Í¨¹ý Builder.headers ·½·¨ÅäÖýøÈ¥¡£

ͨ¹ý Internal.instance.addLenient ·½·¨Ö±½ÓÉèÖà name Óë value£¬add Óë set ·½·¨µ×²ãÒ²Êǵ÷ÓÃÕâ¸ö·½·¨¡£²»¹ýÕâ¸ö·½·¨ÐèÒª±£Ö¤ Internal.instance Òѳõʼ»¯£¬¼´ OkHttpClient ÒÑ´´½¨£¬·ñÔò»áÅ׳ö¿ÕÖ¸ÕëÒì³£¡£

OkHttp ÖÐ post ÇëÇóÅ׳öÒì³£

µ±ÎÒÃÇʹÓà Request.Builder Ààͨ¹ý post(RequestBody)·½·¨½øÐÐ post ÇëÇó¹¹Ôìʱ£¬Èô²»¶Ô RequestBody ×öÅпղÙ×÷£¬ÔòÓпÉÄÜ»áÅ׳ö IllegalArgumentException¡£

post(RequestBody)·½·¨×îÖÕ»áµ÷Óà method()·½·¨£¬Ëü»á¶ÔÇëÇóÀàÐÍÓë body ×öУÑ飬Èô post ÇëÇó¶ÔÓ¦µÄ body Ϊ null£¬ÔòÅ׳öÒì³£¡£´úÂëÈçÏ£º

public Builder method(String method, RequestBody body) {
if (method == null) throw new NullPointerException("method == null");
if (method.length() == 0) throw new IllegalArgumentException("method.length() == 0");
if (body != null && !HttpMethod.permitsRequestBody(method)) {
throw new IllegalArgumentException("method " + method + " must not have a request body.");
}
//ÕâÀï±ãÊÇ body Ϊ¿Õʱ£¬Òì³£Å׳öµã
if (body == null && HttpMethod.requiresRequestBody(method)) {
throw new IllegalArgumentException("method " + method + " must have a request body.");
}
this.method = method;
this.body = body;
return this;
}

ËùÒÔÔÚ¹¹Ôì post ÇëÇóʱ£¬ÐèÒª¶Ô RequestBody ½øÐзǿÕÅжϣ¬Èô RequestBody Ϊ¿Õ£¬ÔòÐèÒª¹¹ÔìÒ»¸öÎÞÄÚÈÝµÄ RequestBody ¶ÔÏó¡£

OkHttp ÔÚ HTTP2 ЭÒéÏ Response ¼àÌýÏ̱߳ÀÀ£

ÔÚ½ÓÈë OkHttp ²¢Ê¹Óà HTTP2 ЭÒé½øÐÐͨÐź󣬵ÚÈý·½Ó¦ÓñÀÀ£¼ì²â¹¤¾ß£¨Èç Bugly£©»áÊÕ¼¯µ½ÏßÉϰ汾¹ØÓÚ OkHttp µÄÁ½ÖÖ±ÀÀ££¬·Ö±ðΪ EOFException¡¢ArrayIndexOutOfBoundsException¡£ÕâÁ½ÖÖ±ÀÀ£µÄ¶ÑÕ»ÐÅÏ¢ÏÔʾ£¬¾ùÊÇÔÚ FramedConnection ÄÚ²¿Àà Reader µÄ execute( )·½·¨ÖÐÅ׳öµÄ¡£

@Override protected void execute() {
......
try {
......
} catch (IOException e) {
......
} finally {
try {
//Å׳öµã 1
close(connectionErrorCode, streamErrorCode);
} catch (IOException ignored) {
}
£¯£¯Å׳öµã 2
Util.closeQuietly(frameReader);
}
}

¾¿ÆäÔ­Òò£¬Reader µÄ execute ·½·¨±»¶ÀÁ¢Ï̵߳÷ÓýøÐÐ Response µÄ¼àÌý£¬ÔÚÁ¬½Ó¶Ï¿ª»òÒì³£ÖжϵÄÇé¿öÏ£¬»á½øÈë´úÂëÖÐ finally ´úÂë¿é£¬¶ø finally ´úÂë¿éÖ» Catch סÁË OkHttp ¿ÉÄÜÅ׳öµÄÒì³££¬²¢Ã»ÓйØ×¢ Okio Å׳öµÄÒì³£¡£

Õâ¸öÎÊÌ⵱ǰ»¹ÎÞ·¨Îȶ¨¸´ÏÖ£¬¿ÉÄܳöÏÖÔÚÁ½¶Ë£¬Ò²¿ÉÄܳöÏÖÔÚ¹úÄÚ¸´ÔÓµÄÍøÂç»·¾³Ï£¬ÅŲé½ÏΪ¸´ÔÓ¡£¶ø¶ÔÁ¬½Ó¶Ï¿ªÓëÒì³£Öжϵȳ¡¾°£¬Èç¹ûÎÒÃÇ Catch סËùÓеÄÒì³££¬Ò²²»»á¶ÔÓû§ÓÐÈκÎÓ°Ïì¡£

ĿǰÎÒÃǵĴ¦Àí·½Ê½±ãÊÇ¶Ô OkHttp ½øÐÐÖØ´ò°ü£¬¶ÔÕû¸ö execute()·½·¨½øÐв¶»ñ£¬ÒÔ½â¾ö Response ¼àÌýÏ̱߳ÀÀ£µÄÎÊÌâ¡£

ÔÚ HTTP2 ЭÒéÏÂÍ·ÐÅϢСдÎÊÌâ

HTTP2 ΪÁ˽â¾ö HTTP1.X ÖÐÍ·ÐÅÏ¢¹ý´óµ¼ÖÂЧÂʵÍϵÄÎÊÌ⣬Ìá³öÁËͨ¹ý HPACK ѹËõË㷨ѹËõÍ·²¿ÐÅÏ¢µÄ½â¾ö·½°¸¡£

ÕýÒòΪ HPACK ÒÔË÷Òý´úÌæÍ·²¿×ֶΣ¬ËùÒÔÏàͬͷ²¿×Ö¶ÎÈôÒòΪ´óСдµÄÎÊÌâµ¼Ö´æÔÚ¶à¸öË÷Òý£¬ÊÇÒ»ÖֺܴóµÄÀË·Ñ¡£¾Ù¸öÀý×Ó£¬¡°accept-encoding¡±¡¢¡°Accept-Encoding¡±Óë¡°ACCEPT-ENCODING¡±±í´ïµÄÊÇÒ»¸öÒâ˼£¬ËùÒÔ HTTP2 ¹æ¶¨£¬Í·²¿ÐÅϢͳһÓÃСд¡£

OkHttp µÄʵÏÖ£¬Ò²ÊÇͳһ²ÉÓÃСд£º

private static final Header[] STATIC_HEADER_TABLE = new Header[] {
......
new Header("accept-charset", ""),
new Header("accept-encoding", "gzip, deflate"),
new Header("accept-language", ""),
new Header("accept-ranges", ""),
new Header("accept", ""),
......
};

ËùÒÔµ±ÎÒÃÇÐèÒªÕë¶ÔijЩͷÐÅÏ¢½øÐÐÂß¼­´¦Àíʱ£¬Ê×ÏÈÒª¶Ô×ֶνøÐÐСдµÄ¸ñʽ»¯²Ù×÷£¬ÒÔ±ÜÃâ¼àÌý²»µ½Í·²¿×ֶλòÌí¼ÓµÄ´óдͷ²¿×ֶα»Ð¡Ð´Í·²¿×ֶθ²¸Ç¡£

6×ܽá

Õ¾ÔÚ¼¼ÊõµÄ½Ç¶È½â¾öÓû§Í´µãÊÇÿ¸ö¿ª·¢ÕßµÄÔ¸¾°£¬HTTPS ¸ÄÔìËäȻֻÊÇÒ»´ÎÆÕͨµÄ¼¼Êõ¸ÄÔ죬µ«¶ÔÓû§Òþ˽±£»¤ÓëÓû§ÌåÑéÓÅ»¯È´ÓÐ×ÅÉîÔ¶µÄÓ°Ï졣ͨ¹ý HTTPS ¸ÄÔìÏîÄ¿£¬58 ͬ³Ç App Íê³ÉÁË½Ó¿ÚµÄ HTTPS »¯£¬Êý¾Ý¼àÌýÓëÄÚÈÝ´Û¸ÄÒѳÉÍùÊ£¬Óû§ÌåÑéÒ²µÃµ½Á˱£ÕÏ£¬µ«ÓÉÓÚ 58 ͬ³Ç App Éæ¼°µ½ÖÚ¶àÒµÎñ£¬HTTPS ÐÔÄÜ·½ÏòÉÏÈÔÈ»Óкܴó¿Õ¼äؽ´ýÎÒÃǺóÐøÓÅ»¯¡£

   
2186 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì