ASP.NET MVC Урок 1-F / ASP.NET MVC Урок B
.pdf$63 1(7 09& ǻȘȖȒ % -VRQ tutorial
ASP*, .NET*
Цель урока. Научиться работать с форматом json. Инструменты по работе с json. Написание сторонних запросов, авторизация через получение данных от facebook и vkontakte. Ajax в работе с json (авторизацию переписать). API сайта.
Json и Json.net
Json – это текстовый формат данных, основанный на Javascript. Пример данных в Json:
^
ILUVW1DPH ɂɜɚɧ
ODVW1DPH ɂɜɚɧɨɜ
DGGUHVV^
VWUHHW$GGUHVV Ɇɨɫɤɨɜɫɤɨɟ ɲ ɤɜ
FLW\ Ʌɟɧɢɧɝɪɚɞ
SRVWDO&RGH
`
SKRQH1XPEHUV>
|
@ |
` |
|
В своей практике я работал с json с такими приложениями как yandex.maps api, facebook api, vk api, bronni api (это такой туристический портал), и даже при работе с биткоинкошельком. Для этого используется JSON.net библиотека от http://james.newtonking.com/pages/jsonnet.aspx.
Изучим ее подробнее:
Установим
Изучим преобразования из json в объекты и назад
Десериализация из сложных форматов
Работа с facebook API (пример) — авторизация
Устрановим
30! *HW 3DFNDJH-VRQQHW
,G 9HUVLRQ 'HVFULSWLRQ 5HOHDVH 1RWHV
1HZWRQVRIW -VRQ -VRQ1(7LVDSRSXODU KLJK SHUIRUPDQFH 30! ,QVWDOO 3DFNDJH 1HZWRQVRIW -VRQ
6XFFHVVIXOO\ LQVWDOOHG1HZWRQVRIW-VRQ
6XFFHVVIXOO\ DGGHG1HZWRQVRIW-VRQWR /HVVRQ3URMHFW
Документация
По этой ссылке находится документация. Мы начнем с простого преобразования объекта в json формат и обратно. Создадим LessonProject.Console и сделаем его проектом поумолчанию. Добавим тип User:
SXEOLF FODVV 8VHU
^
SXEOLF VWULQJ,G ^JHW VHW`
SXEOLF VWULQJ1DPH ^JHW VHW`
SXEOLF VWULQJ)LUVW1DPH ^JHW VHW`
SXEOLF VWULQJ0LGGOH1DPH ^JHW VHW`
SXEOLF VWULQJ/DVW1DPH ^JHW VHW`
SXEOLF VWULQJ8VHU1DPH ^JHW VHW`
SXEOLF VWULQJ*HQGHU ^JHW VHW`
SXEOLF VWULQJ(PDLO ^JHW VHW`
`
Создадим объект и преобразуем в json:
YDUXVHU QHZ8VHU
^
,G
(PDLO FKHUQLNRY#JPDLO FRP
8VHU1DPH UROOLQ[
1DPH $QGUH\
)LUVW1DPH $QGUH\
0LGGOH1DPH $OH[DQGURYLFK
/DVW1DPH &KHUQLNRY
*HQGHU 0
`
YDUMVRQ8VHU -VRQ&RQYHUW 6HULDOL]H2EMHFW XVHU
6\VWHP &RQVROH :ULWH MVRQ8VHU
6\VWHP &RQVROH 5HDG/LQH
Результат:
^,G 1DPH $QGUH\ )LUVW1DPH $QGUH\ 0LGGOH1DPH $OH[DQGURYLFK /DVW1DPH &KHUQLN RY 8VHU1DPH UROOLQ[ *HQGHU 0 (PDLO FKHUQLNRY#JPDLO FRP`
Попробуем обратное:
YDUMVRQ8VHU6RXUFH ^? ,G? ? ? ? 1DPH? ?$QGUH\? ? )LUVW1DPH? ?$QGUH\? ? 0LGGOH1DP H? ?$OH[DQGURYLFK? ? /DVW1DPH? ? &KHUQLNRY? ? 8VHU1DPH? ? UROOLQ[? ? *HQGHU? ? 0? ? (PDL O? ? FKHUQLNRY#JPDLO FRP? `
YDUXVHU -VRQ&RQYHUW 'HVHULDOL]H2EMHFW 8VHU! MVRQ8VHU6RXUFH
И получаем результат:
Т.е. работает в обоих направлениях. Но немного усложним. Например, зададим Gender через перечисляемый тип Male и Female, и в json должно передаваться именно Male и Female. А Id – это числовое значение:
SXEOLF FODVV 8VHU
^
SXEOLF HQXP*HQGHU(QXP
^
0DOH
)HPDOH
`
SXEOLF LQW,G ^JHW VHW`
SXEOLF VWULQJ1DPH ^JHW VHW`
SXEOLF VWULQJ)LUVW1DPH ^JHW VHW`
SXEOLF VWULQJ0LGGOH1DPH ^JHW VHW`
SXEOLF VWULQJ/DVW1DPH ^JHW VHW`
SXEOLF VWULQJ8VHU1DPH ^JHW VHW`
SXEOLF*HQGHU(QXP *HQGHU ^JHW VHW`
SXEOLF VWULQJ(PDLO ^JHW VHW`
`
Пробуем первую часть:
YDUXVHU QHZ8VHU
^
,G
(PDLO FKHUQLNRY#JPDLO FRP
8VHU1DPH UROOLQ[
1DPH $QGUH\
)LUVW1DPH $QGUH\
0LGGOH1DPH $OH[DQGURYLFK
/DVW1DPH &KHUQLNRY
*HQGHU 8VHU *HQGHU(QXP 0DOH
`
YDUMVRQ8VHU -VRQ&RQYHUW 6HULDOL]H2EMHFW XVHU
Результат:
^,G 1DPH $QGUH\ )LUVW1DPH $QGUH\ 0LGGOH1DPH $OH[DQGURYLFK /DVW1DPH &KHUQLNR Y 8VHU1DPH UROOLQ[ *HQGHU (PDLO FKHUQLNRY#JPDLO FRP`
Добавим:
>-VRQ&RQYHUWHUW\SHRI6WULQJ(QXP&RQYHUWHU @
SXEOLF HQXP*HQGHU(QXP
^
0DOH
)HPDOH
`
Результат:
^,G 1DPH $QGUH\ )LUVW1DPH $QGUH\ 0LGGOH1DPH $OH[DQGURYLFK /DVW1DPH &KHUQLNR
Y 8VHU1DPH UROOLQ[ *HQGHU 0DOH (PDLO FKHUQLNRY#JPDLO FRP`
Уже лучше. Обратно проверяем – всё ок. Изучим другие атрибуты, задающие тонкие правила настройки. Например, в jsonформате будут имена в венгерской записи типа first_name:
>-VRQ2EMHFW@
SXEOLF FODVV 8VHU
^
>-VRQ&RQYHUWHUW\SHRI6WULQJ(QXP&RQYHUWHU @
SXEOLF HQXP*HQGHU(QXP
^
0DOH
)HPDOH
`
>-VRQ3URSHUW\LG@
SXEOLF LQW,G ^JHW VHW`
>-VRQ3URSHUW\QDPH@
SXEOLF VWULQJ1DPH ^JHW VHW`
>-VRQ3URSHUW\ILUVWBQDPH@
SXEOLF VWULQJ)LUVW1DPH ^JHW VHW`
>-VRQ3URSHUW\PLGGOHBQDPH@
SXEOLF VWULQJ0LGGOH1DPH ^JHW VHW`
>-VRQ3URSHUW\ODVWBQDPH@
SXEOLF VWULQJ/DVW1DPH ^JHW VHW`
>-VRQ3URSHUW\XVHUBQDPH@
SXEOLF VWULQJ8VHU1DPH ^JHW VHW`
>-VRQ3URSHUW\JHQGHU@
SXEOLF*HQGHU(QXP *HQGHU ^JHW VHW`
>-VRQ3URSHUW\HPDLO@
SXEOLF VWULQJ(PDLO ^JHW VHW`
`
Результат:
^LG QDPH $QGUH\ ILUVWBQDPH $QGUH\ PLGGOHBQDPH $OH[DQGURYLFK ODVWBQDPH &KHUQL NRY XVHUBQDPH UROOLQ[ JHQGHU 0DOH HPDLO FKHUQLNRY#JPDLO FRP`
Для описания списка добавим класс Photo:
>-VRQ2EMHFW@
SXEOLF FODVV 3KRWR
^
>-VRQ3URSHUW\LG@
SXEOLF LQW,G ^JHW VHW`
>-VRQ3URSHUW\QDPH@
SXEOLF VWULQJ1DPH ^JHW VHW`
`
И в User добавим:
>-VRQ3URSHUW\SKRWRBDOEXP@ SXEOLF/LVW 3KRWR! 3KRWR$OEXP ^JHW VHW`
Результат:
^LG QDPH $QGUH\ ILUVWBQDPH $QGUH\ PLGGOHBQDPH $OH[DQGURYLFK ODVWBQDPH &KHUQL NRY XVHUBQDPH UROOLQ[ JHQGHU 0DOH HPDLO FKHUQLNRY#JPDLO FRP SKRWRBDOEXP>^L G QDPH ə ɫ ɢɧɫɬɚɝɪɚɦɦɨɦ` ^LG QDPH ə ɧɚ ɮɨɧɟ ɡɚɧɢɠɟɧɧɨɝɨ ɬɚɡɚ`@`
Всё просто и предсказуемо.
Разберем сложный случай, например, когда для Gender нам надо описывать не Male\Female, а M\F. Для этого создаем класс по разбору GenderEnumConverter:
SXEOLF FODVV *HQGHU(QXP&RQYHUWHU -VRQ&RQYHUWHU
^
SXEOLF RYHUULGH REMHFW 5HDG-VRQ -VRQ5HDGHU UHDGHU
7\SH REMHFW7\SH
REMHFWH[LVWLQJ9DOXH
-VRQ6HULDOL]HU VHULDOL]HU
^
YDU YDOXH UHDGHU 9DOXH 7R6WULQJ
LI VWULQJ&RPSDUHYDOXH 0 WUXH
^
UHWXUQ8VHU *HQGHU(QXP 0DOH
`
LI VWULQJ&RPSDUHYDOXH ) WUXH
^
UHWXUQ8VHU *HQGHU(QXP )HPDOH
`
UHWXUQ8VHU *HQGHU(QXP 0DOH
`
SXEOLF RYHUULGH YRLG :ULWH-VRQ -VRQ:ULWHU ZULWHUREMHFW YDOXH -VRQ6HULDOL]HU VHULDOL]H U
^
YDUREM 8VHU *HQGHU(QXPYDOXH
:ULWH DVVRFLDWLYH DUUD\ ILHOG QDPH
ZULWHU :ULWH9DOXHYDOXH7R6WULQJ 6XEVWULQJ
`
SXEOLF RYHUULGH ERRO &DQ&RQYHUW7\SH REMHFW7\SH
^
UHWXUQ IDOVH
`
`
И устанавливаем этот конвертер для обработки
>-VRQ&RQYHUWHUW\SHRI*HQGHU(QXP&RQYHUWHU @
SXEOLF HQXP*HQGHU(QXP
^
0DOH
)HPDOH
`
Вообще, конвертеры могут быть бесконечно сложными для разбора jsonданных. Можно обрабатывать нетипичные записи дат, сложные структуры данных, формировать сериализацию своих классов.
Работа с facebook
Всё это понятно и скучно, так что метнемся работать с facebook API. Развлечений всем! Для начала заведем проект LessonProject.FacebookAPI. Добавим туда Json.NET и свяжем с основным проектом.
На facebook надо завести ApplicationID по адресу: https://developers.facebook.com/apps
Создаем, получаем:
Нам интересно будет AppID и AppSecret.
Добавляем эти данные в Config/FacebookSetting.cs (уже знаем, как это делается):
SXEOLF FODVV )DFHERRN6HWWLQJ &RQILJXUDWLRQ6HFWLRQ
^
>&RQILJXUDWLRQ3URSHUW\ $SS,',V5HTXLUHG WUXH@
SXEOLF VWULQJ $SS,'
^
JHW
^
UHWXUQ WKLV> $SS,'@DV VWULQJ
`
VHW
^
WKLV> $SS,'@ YDOXH
`
`
>&RQILJXUDWLRQ3URSHUW\ $SS6HFUHW,V5HTXLUHG WUXH@
SXEOLF VWULQJ $SS6HFUHW
^
JHW
^
UHWXUQ WKLV> $SS6HFUHW@DV VWULQJ
`
VHW
^
WKLV> $SS6HFUHW@ YDOXH
`
`
`
Общение с фейсбуком происходит так:
Попросим пользователя авторизоваться, так мы узнаем, какие права у нас есть
Ответом этого будет токен доступа, по нему мы будем получать информацию Получаем информацию про самого пользователя
Создадим интерфейс, который будет реализовывать наш FacebookSetting (чтобы была обратная совместимость) (LessonProject.FacebookAPI/IFbAppConfig.cs):
SXEOLF LQWHUIDFH ,)E$SS&RQILJ
^
VWULQJ $SS,' ^JHW`
VWULQJ $SS6HFUHW ^JHW`
`
Добавляем в FacebookSetting (/Global/Config/FacebookSetting.cs):
SXEOLF FODVV )DFHERRN6HWWLQJ &RQILJXUDWLRQ6HFWLRQ ,)E$SS&RQILJ
Используя наш AppID, мы идем по строке типа:
KWWSVZZZIDFHERRN FRP GLDORJ RDXWK"FOLHQWBLG UHGLUHFWBXUL KWWS$) )ORFDOKR VW$))DFHERRN )7RNHQ VFRSH HPDLO
И это выглядит так:
Если мы нажимаем «Перейти к приложению» — то нас переправляют на страницу
KWWS ORFDOKRVW )DFHERRN 7RNHQ с параметром code, по которому мы можем получить токен (который действует некоторое время). Выполняем такой запрос:
KWWSVJUDSK IDFHERRN FRP RDXWK DFFHVVBWRNHQ"FOLHQWBLG UHGLUHFWBXUL KWWS ORFDO KRVW)DFHERRN 7RNHQ FOLHQWBVHFUHW H GH IG I H GFH E D D FRGH $4$6F.8<.*S]ZLM]7 < 6+M12G 4 QV\U<3G-D3K; U Z%2X0UGLP/ K E*Y +$K 7/ R-\= J1JL% %F&H+ *B=M K KOIWB%)E2I,-,=-% Q.: 4 L5 D 99,P[0 4<-DV H9J TW<1NT8F:EJ;'6.-(1FXRP8; KD[)8)G.;U9M/ DF1=6RF(6V[ QI[B)\)B4OEZQ82 FZRJ
U/S
На что получаем ответ:
DFFHVVBWRNHQ $$$% 'D =%P5 %$0&2[ =$U<Y)X R5NP=&UZ=$EYS:=% =&/%HLRRVO\<3=%9Z+M[6SH .]-9/)3,[ZZ I ' 7,(L0$S]8 (0R'S2[( X$='=' H[SLUHV
Нам нужен этот access_token, сохраняем его, и с помощью него мы запрашиваем данные по ссылке: