×Ô
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 ÐÔÄÜ·½ÏòÉÏÈÔÈ»Óкܴó¿Õ¼äؽ´ýÎÒÃǺóÐøÓÅ»¯¡£ |