ASP.NET MVC Урок 1-F / ASP.NET MVC Урок B
.pdfKWWSV JUDSK IDFHERRNFRP PH"DFFHVVBWRNHQ $$$% 'D =%P5 %$,PL72 4ZX8;EJ+3/=%4:P$\=%8NM5$D91V Y DTD)PW K =%YXU8SY1 (;GG\ G-OG=$M:7[6G H=%+O<0].ZG[J='='
На что он нам отвечает:
^LG QDPH $QGUH\ &KHUQLNRY ILUVWBQDPH $QGUH\ ODVWBQDPH &KHUQLNRY OLQ N KWWS ? ? ZZZ IDFHERRN FRP? FKHUQLNRY XVHUQDPH FKHUQLNRY JHQGHU PDOH HPDLO FKHUQ LNRY?X JPDLO FRP WLPH]RQH ORFDOH UXB58 YHULILHG WUXH XSGDWHGBWLPH 7
`
И вот это мы приведем к классу FbUserInfo (LessonProject.FacebookAPI/FbUserInfo.cs):
>-VRQ2EMHFW@
SXEOLF FODVV )E8VHU,QIR
^
>-VRQ3URSHUW\LG@
SXEOLF VWULQJ,G ^JHW VHW`
>-VRQ3URSHUW\QDPH@
SXEOLF VWULQJ1DPH ^JHW VHW`
>-VRQ3URSHUW\ILUVWBQDPH@
SXEOLF VWULQJ)LUVW1DPH ^JHW VHW`
>-VRQ3URSHUW\ODVWBQDPH@
SXEOLF VWULQJ/DVW1DPH ^JHW VHW`
>-VRQ3URSHUW\OLQN@
SXEOLF VWULQJ/LQN ^JHW VHW`
>-VRQ3URSHUW\XVHUQDPH@
SXEOLF VWULQJ8VHU1DPH ^JHW VHW`
>-VRQ3URSHUW\JHQGHU@
SXEOLF VWULQJ*HQGHU ^JHW VHW`
>-VRQ3URSHUW\HPDLO@
SXEOLF VWULQJ(PDLO ^JHW VHW`
>-VRQ3URSHUW\ORFDOH@
SXEOLF VWULQJ/RFDOH ^JHW VHW`
>-VRQ3URSHUW\WLPH]RQH@
SXEOLF GRXEOH" 7LPH]RQH ^JHW VHW`
>-VRQ3URSHUW\YHULILHG@
SXEOLF ERRO" 9HULILHG ^JHW VHW`
>-VRQ3URSHUW\XSGDWHGBWLPH@
SXEOLF'DWH7LPH" XSGDWHG7LPH ^JHW VHW`
`
Всю описанную выше работу заключаем в FbProvider.cs (LessonProject.FacebookAPI/Provider.cs):
SXEOLF FODVV )E3URYLGHU
^
SULYDWH VWDWLF VWULQJ $XWKRUL]H8UL KWWSV JUDSK IDFHERRN FRP RDXWK DXWKRUL]H"FOLHQWBL G ^ ` UHGLUHFWBXUL ^ ` VFRSH HPDLO
SULYDWH VWDWLF VWULQJ*HW$FFHVV7RNHQ8UL KWWSV JUDSK IDFHERRN FRP RDXWK DFFHVVBWRNHQ" FOLHQWBLG ^ ` UHGLUHFWBXUL ^ ` FOLHQWBVHFUHW ^ ` FRGH ^ `
SULYDWH VWDWLF VWULQJ*HW8VHU,QIR8UL KWWSV JUDSK IDFHERRN FRP PH"DFFHVVBWRNHQ ^ `
SULYDWH VWDWLF VWULQJ*UDSK8UL KWWSV JUDSK IDFHERRN FRP ^ `
SXEOLF,)E$SS&RQILJ &RQILJ ^JHW VHW`
SXEOLF VWULQJ $FFHVV7RNHQ ^JHW VHW`
SXEOLF VWULQJ $XWKRUL]H VWULQJUHGLUHFW7R
^
UHWXUQ VWULQJ)RUPDW$XWKRUL]H8UL &RQILJ$SS,' UHGLUHFW7R
`
SXEOLF ERRO *HW$FFHVV7RNHQ VWULQJFRGHVWULQJUHGLUHFW7R
^
YDUUHTXHVW VWULQJ)RUPDW *HW$FFHVV7RNHQ8UL &RQILJ$SS,' UHGLUHFW7R &RQILJ$SS6H FUHW FRGH
:HE&OLHQW ZHE&OLHQW QHZ:HE&OLHQW
VWULQJUHVSRQVH ZHE&OLHQW 'RZQORDG6WULQJ UHTXHVW
WU\
^
YDUSDLU5HVSRQVH UHVSRQVH 6SOLW
$FFHVV7RNHQ SDLU5HVSRQVH> @ 6SOLW > @
UHWXUQ WUXH
`
FDWFK([FHSWLRQ H[
^
UHWXUQ IDOVH
`
`
SXEOLF -2EMHFW*HW8VHU,QIR
^
YDUUHTXHVW VWULQJ)RUPDW *HW8VHU,QIR8UL$FFHVV7RNHQ
:HE&OLHQW ZHE&OLHQW QHZ:HE&OLHQW
VWULQJUHVSRQVH ZHE&OLHQW 'RZQORDG6WULQJ UHTXHVW
UHWXUQ -2EMHFW 3DUVH UHVSRQVH
`
`
Где
Authorize – это формирование ссылки для запроса прав. GetAccessToken – это запрос по получению временного токена. GetUserInfo – это запрос по получению данных пользователя.
Обратите внимание, как мы используем :HE&OLHQW 'RZQORDG6WULQJ – и оппа, мы получили нужные данные из недр интернета.
Едем дальше. Создадим контроллер FacebookController (/Areas/Default/Controllers/FacebookController.cs):
SXEOLF FODVV )DFHERRN&RQWUROOHU 'HIDXOW&RQWUROOHU
^
SULYDWH)E3URYLGHU IE3URYLGHU
SURWHFWHG RYHUULGH YRLG ,QLWLDOL]H6\VWHP :HE 5RXWLQJ 5HTXHVW&RQWH[W UHTXHVW&RQWH[W
^
IE3URYLGHU QHZ)E3URYLGHU
IE3URYLGHU &RQILJ &RQILJ )DFHERRN6HWWLQJ
EDVH,QLWLDOL]H UHTXHVW&RQWH[W
`
SXEOLF $FWLRQ5HVXOW,QGH[
^
UHWXUQ5HGLUHFW IE3URYLGHU$XWKRUL]HKWWS+RVW1DPH)DFHERRN 7RNHQ
`
SXEOLF $FWLRQ5HVXOW7RNHQ
^
LI5HTXHVW 3DUDPV$OO.H\V &RQWDLQVFRGH
^
YDUFRGH 5HTXHVW 3DUDPV>FRGH@
LIIE3URYLGHU *HW$FFHVV7RNHQ FRGHKWWS+RVW1DPH)DFHERRN 7RNHQ
^
YDUM2EM IE3URYLGHU *HW8VHU,QIR
YDUIE8VHU,QIR -VRQ&RQYHUW 'HVHULDOL]H2EMHFW )E8VHU,QIR! M2EM 7R6WULQJ
UHWXUQ9LHZ IE8VHU,QIR
`
`
UHWXUQ9LHZ&DQW,QLWLDOL]H
`
`
В Initialize передаем в )E3URYLGHU $SS,'и $SS6HFUHW. После захода – делаем редирект на facebook с запросом прав у пользователя (окошко разрешения). Если пользователь уже нам это когдато разрешил, чтобы не спрашивать по 100 раз, facebook нас переправит на страницу /Facebook/Token. Если код для получения токена не удалось получить – возвращаем View CantInitialize (/Areas/Default/Views/Facebook/CantInitialize.cshtml):
#^
9LHZ%DJ 7LWOH &DQW,QLWLDOL]H
/D\RXW a$UHDV 'HIDXOW 9LHZV 6KDUHG B/D\RXW FVKWPO
`
K!&DQW,QLWLDOL]HK!
K! ɇɭ ɧɟɬ ɬɚɤ ɧɟɬK!
Иначе, когда всё хорошо, то получаем наш токен (он сохраняется в fbProvider) и запрашиваем данные о пользователе. Получив – преобразовываем в объект класса FbUserInfo и выводим во
View (/Areas/Default/Views/Facebook/Token.cshtml):
#PRGHO /HVVRQ3URMHFW )DFHERRN$3, )E8VHU,QIR
#^
9LHZ%DJ 7LWOH 7RNHQ
/D\RXW a$UHDV 'HIDXOW 9LHZV 6KDUHG B/D\RXW FVKWPO
`
K!ȾɚɧɧɵɟK!S! ȼɨɬ ɱɬɨ ɹ ɩɪɨ ɬɟɛɹ ɡɧɚɸS!
GO FODVV GO KRUL]RQWDO!
GW!,'GW!
GG!#0RGHO ,GGG!
GW!)LUVW1DPHGW!
GG!#0RGHO )LUVW1DPHGG!
GW!/DVW1DPHGW!
GG!#0RGHO /DVW1DPHGG!
GW!/LQNGW!
GG!#0RGHO /LQNGG!
GO!
Клиентский код/Серверный код (AccessControlAllowOrigin)
Рассмотрим еще ситуацию, когда всё это взаимодействие заключено в jsфайлах, мы выполняем только ajaxзапросы. Изменим код метода Token. Получаем данные пользователя не серверным кодом от facebook, а передаем во View токен
(/Areas/Default/Controllers/FacebookController.cs:Token):
SXEOLF $FWLRQ5HVXOW7RNHQ
^
LI5HTXHVW 3DUDPV$OO.H\V &RQWDLQVFRGH
^
YDUFRGH 5HTXHVW 3DUDPV>FRGH@
LIIE3URYLGHU *HW$FFHVV7RNHQ FRGHKWWS+RVW1DPH)DFHERRN 7RNHQ
^
YDU M2EM IE3URYLGHU *HW8VHU,QIR
YDU IE8VHU,QIR -VRQ&RQYHUW 'HVHULDOL]H2EMHFW )E8VHU,QIR! M2EM 7R6WULQJ
9LHZ%DJ 7RNHQ IE3URYLGHU$FFHVV7RNHQ
UHWXUQ9LHZ
`
`
UHWXUQ9LHZ&DQW,QLWLDOL]H
`
Изменим Token.cshtml (/Areas/Default/Views/Facebook/Token.cshtml):
#^
9LHZ%DJ 7LWOH 7RNHQ
/D\RXW a$UHDV 'HIDXOW 9LHZV 6KDUHG B/D\RXW FVKWPO
`
#VHFWLRQ VFULSWV ^
#6FULSWV 5HQGHU a 6FULSWV GHIDXOW IDFHERRN WRNHQ MV
`
#+WPO +LGGHQ 7RNHQ 9LHZ%DJ 7RNHQ DV VWULQJK!ȾɚɧɧɵɟK!S! ȼɨɬ ɱɬɨ ɹ ɩɪɨ ɬɟɛɹ ɡɧɚɸS!
GO FODVV GO KRUL]RQWDO!
GW!,'GW!
GG LG ,'!GG!
GW!)LUVW1DPHGW!
GG LG )LUVW1DPH!GG!
GW!/DVW1DPHGW!
GG LG /DVW1DPH!GG!
GW!/LQNGW!
GG LG /LQN!GG!GO!
Добавляем facebooktoken.js (/Scripts/default/facebooktoken.js):
IXQFWLRQ )DFHERRN7RNHQ^
BWKLV WKLV
WKLVDMD[*HW8VHU,QIR KWWSV JUDSK IDFHERRN FRP PH"DFFHVVBWRNHQ
WKLVLQLW IXQFWLRQ^
YDUWRNHQ 7RNHQYDO
DMD[ ^
W\SH*(7
GDWD7\SHMVRQ
XUO BWKLV DMD[*HW8VHU,QIR WRNHQ
VXFFHVVIXQFWLRQGDWD
^
,'WH[W GDWD LG
)LUVW1DPHWH[W GDWD ILUVWBQDPH
/DVW1DPHWH[W GDWD ODVWBQDPH
/LQNWH[W GDWD OLQN
`
`
`
`
YDUIDFHERRN7RNHQ QXOO
UHDG\IXQFWLRQ^
IDFHERRN7RNHQ QHZ)DFHERRN7RNHQ
IDFHERRN7RNHQ LQLW
`
Запускаем, проверяем. Всё отлично. Но обратим внимание на такой параметр в httpответе:
Accesscontrolalloworigin – это параметр, который, будучи установлен, позволяет делать ajax запросы из браузера к сайту, размещенному на другом домене.
Т.е. если мы обращаемся по $.ajax() из браузера и в ответе этого заголовка нет, то выдается ошибка:
2ULJLQ KWWS ORFDOKRVW LV QRW DOORZHG E\$FFHVV &RQWURO$OORZ 2ULJLQ
Для этого создадим атрибут, который будет добавлять этот заголовок, если мы захотим организовать обращение к нашему сайту с других сайтов (/Attribute/AllowCrossSiteJson.cs):
SXEOLF FODVV $OORZ&URVV6LWH-VRQ$WWULEXWH $FWLRQ)LOWHU$WWULEXWH
^
SXEOLF RYHUULGH YRLG 2Q$FWLRQ([HFXWLQJ $FWLRQ([HFXWLQJ&RQWH[W ILOWHU&RQWH[W
^
ILOWHU&RQWH[W 5HTXHVW&RQWH[W +WWS&RQWH[W 5HVSRQVH$GG+HDGHU $FFHVV &RQWURO$OORZ 2UL JLQ
EDVH2Q$FWLRQ([HFXWLQJ ILOWHU&RQWH[W
`
`
Добавим использование. Напимер, методaction OK, который всегда будет возвращать { “result”: “OK”} (/Areas/Default/Controllers/HomeController.cs):
>$OORZ&URVV6LWH-VRQ@
SXEOLF $FWLRQ5HVXOW2.
^
UHWXUQ -VRQQHZ^ UHVXOW 2.`-VRQ5HTXHVW%HKDYLRU$OORZ*HW
`
На этом всё по Json и работе с facebook. Можете потренироваться и поработать с авторизацией и взаимодействием с vk api. Документация тут:http://vk.com/developers.php.
Все исходники находятся по адресу https://bitbucket.org/chernikov/lessons