рдкрд╛рда рдХрд╛ рдЙрджреНрджреЗрд╢реНрдпред Json рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реАрдЦреЗрдВред Json рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгред рдлреЗрд╕рдмреБрдХ рдФрд░ vkontakte рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рддреГрддреАрдп-рдкрдХреНрд╖ рдЕрдиреБрд░реЛрдз, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд▓рд┐рдЦрдирд╛ред Ajax json рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ (рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛)ред рд╕рд╛рдЗрдЯ рдПрдкреАрдЖрдИред
Json рдФрд░ Json.net
Json рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рдЖрдзрд╛рд░рд┐рдд рдкрд╛рда рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рд╣реИред
Json рдореЗрдВ рдирдореВрдирд╛ рдбреЗрдЯрд╛:
{ "firstName": "", "lastName": "", "address": { "streetAddress": " ., 101, .101", "city": "", "postalCode": 101101 }, "phoneNumbers": [ "812 123-1234", "916 123-4567" ] }
рдЕрдкрдиреЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ, рдореИрдВрдиреЗ yandex.maps api, facebook api, vk api, bronni api (рдпрд╣ рдПрдХ рдРрд╕рд╛ рдпрд╛рддреНрд░рд╛ рдкреЛрд░реНрдЯрд▓ рд╣реИ) рдЬреИрд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╕рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рдПрдХ рдмрд┐рдЯрдХреЙрдЗрди рд╡реЙрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рднреАред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, JSON.net рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ
http://james.newtonking.com/pages/json-net.aspx рд╕реЗ рдХрд░реЗрдВ ред
рдЖрдЗрдП рдЗрд╕рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ:
- рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛
- рд╣рдо json рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдФрд░ рдмреИрдХ рдкрд░ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВрдЧреЗ
- рдЬрдЯрд┐рд▓ рдкреНрд░рд╛рд░реВрдкреЛрдВ рд╕реЗ рд╡рд┐рдЪрд▓рди
- рдлреЗрд╕рдмреБрдХ рдПрдкреАрдЖрдИ (рдЙрджрд╛рд╣рд░рдг) - рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
Ustranovim
PM> Get-Package Json.net Id Version Description/Release Notes
рдкреНрд░рд▓реЗрдЦрди
рдпрд╣
рд▓рд┐рдВрдХ рдкреНрд░рд▓реЗрдЦрди рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ json рдлреЙрд░реНрдореЗрдЯ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред LessonProject.Console рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝реЗрдВ:
public class User { public string Id { get; set; } public string Name { get; set; } public string FirstName { get; set; } public string MiddleName { get; set; } public string LastName { get; set; } public string UserName { get; set; } public string Gender { get; set; } public string Email { get; set; } }
рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ json рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ:
var user = new User() { Id = "404", Email = "chernikov@gmail.com", UserName = "rollinx", Name = "Andrey", FirstName = "Andrey", MiddleName = "Alexandrovich", LastName = "Chernikov", Gender = "M" }; var jsonUser = JsonConvert.SerializeObject(user); System.Console.Write(jsonUser); System.Console.ReadLine();
рдкрд░рд┐рдгрд╛рдо:
{"Id":"404","Name":"Andrey","FirstName":"Andrey","MiddleName":"Alexandrovich","LastName":"Chernikov","UserName":"rollinx","Gender":"M","Email":"chernikov@gmail.com"}
рдЖрдЗрдП рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
var jsonUserSource = "{\"Id\":\"405\",\"Name\":\"Andrey\",\"FirstName\":\"Andrey\",\"MiddleName\":\"Alexandrovich\",\"LastName\":\"Chernikov\",\"UserName\":\"rollinx\",\"Gender\":\"M\",\"Email\":\"chernikov@gmail.com\"}"; var user2 = JsonConvert.DeserializeObject<User>(jsonUserSource);
рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ:

рдпрд╛рдиреА рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдиреБрдорд░реЗрдЯреЗрдб рдЯрд╛рдЗрдк рдирд░ рдФрд░ рдорд╛рджрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЗрдВрдбрд░ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд░ рдФрд░ рдорд╛рджрд╛ рдХреЛ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПред рдФрд░ Id рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рд╣реИ:
public class User { public enum GenderEnum { Male, Female } public int Id { get; set; } public string Name { get; set; } public string FirstName { get; set; } public string MiddleName { get; set; } public string LastName { get; set; } public string UserName { get; set; } public GenderEnum Gender { get; set; } public string Email { get; set; } }
рд╣рдо рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
var user = new User() { Id = 404, Email = "chernikov@gmail.com", UserName = "rollinx", Name = "Andrey", FirstName = "Andrey", MiddleName = "Alexandrovich", LastName = "Chernikov", Gender = User.GenderEnum.Male }; var jsonUser = JsonConvert.SerializeObject(user);
рдкрд░рд┐рдгрд╛рдо:
{"Id":404,"Name":"Andrey","FirstName":"Andrey","MiddleName":"Alexandrovich","LastName":"Chernikov","UserName":"rollinx","Gender":0,"Email":"chernikov@gmail.com"}
рдЬреЛрдбрд╝реЗрдВ:
[JsonConverter(typeof(StringEnumConverter))] public enum GenderEnum { Male, Female }
рдкрд░рд┐рдгрд╛рдо:
{"Id":404,"Name":"Andrey","FirstName":"Andrey","MiddleName":"Alexandrovich","LastName":"Chernikov","UserName":"rollinx","Gender":"Male","Email":"chernikov@gmail.com"}
рдкрд╣рд▓реЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рд╡рд╛рдкрд╕ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ - рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред рд╣рдо рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╕реВрдХреНрд╖реНрдо рдЯреНрдпреВрдирд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, json рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рдВрдЧреЗрд░реА рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рдирд╛рдо рд╣реЛрдВрдЧреЗ first_name:
[JsonObject] public class User { [JsonConverter(typeof(StringEnumConverter))] public enum GenderEnum { Male, Female } [JsonProperty("id")] public int Id { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("first_name")] public string FirstName { get; set; } [JsonProperty("middle_name")] public string MiddleName { get; set; } [JsonProperty("last_name")] public string LastName { get; set; } [JsonProperty("user_name")] public string UserName { get; set; } [JsonProperty("gender")] public GenderEnum Gender { get; set; } [JsonProperty("email")] public string Email { get; set; } }
рдкрд░рд┐рдгрд╛рдо:
{"id":404,"name":"Andrey","first_name":"Andrey","middle_name":"Alexandrovich","last_name":"Chernikov","user_name":"rollinx","gender":"Male","email":"chernikov@gmail.com"}
рд╕реВрдЪреА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлреЛрдЯреЛ рд╡рд░реНрдЧ рдЬреЛрдбрд╝реЗрдВ:
[JsonObject] public class Photo { [JsonProperty("id")] public int Id { get; set; } [JsonProperty("name")] public string Name { get; set; } }
рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛрдбрд╝реЗрдВ:
[JsonProperty("photo_album")] public List<Photo> PhotoAlbum { get; set; }
рдкрд░рд┐рдгрд╛рдо:
{"id":404,"name":"Andrey","first_name":"Andrey","middle_name":"Alexandrovich","last_name":"Chernikov","user_name":"rollinx","gender":"Male","email":"chernikov@gmail.com","photo_album":[{"id":1,"name":" "},{"id":2,"name":" "}]}
рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИред
рдЖрдЗрдП рдПрдХ рдХрдард┐рди рдорд╛рдорд▓реЗ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЬреЗрдВрдбрд░ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкреБрд░реБрд╖ / рдорд╣рд┐рд▓рд╛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ M \ F рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ GenderEnumConverter рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ:
public class GenderEnumConverter : JsonConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var value = reader.Value.ToString(); if (string.Compare(value, "M", true) == 0) { return User.GenderEnum.Male; } if (string.Compare(value, "F", true) == 0) { return User.GenderEnum.Female; } return User.GenderEnum.Male; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var obj = (User.GenderEnum)value;
рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХрдирд╡рд░реНрдЯрд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
[JsonConverter(typeof(GenderEnumConverter))] public enum GenderEnum { Male, Female }
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдЬреЛрдВрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реАрдо рд░реВрдк рд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк atypical рджрд┐рдирд╛рдВрдХ рд░рд┐рдХреЙрд░реНрдб, рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдБ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдлреЗрд╕рдмреБрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдпрд╣ рд╕рдм рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдЙрдмрд╛рдК рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдлреЗрд╕рдмреБрдХ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рд╕рднреА рдХреЛ рдордиреЛрд░рдВрдЬрди! рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо LessonProject.FacebookAPI рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рд╡рд╣рд╛рдВ Json.NET рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдореБрдЦреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред
Facebook рдкрд░, рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рдкрд░ ApplicationID рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
https://developers.facebook.com/apps
рд╣рдо рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

рд╣рдо AppID рдФрд░ AppSecret рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦреЗрдВрдЧреЗред
рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ / FacebookSetting.cs рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ (рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ):
public class FacebookSetting : ConfigurationSection { [ConfigurationProperty("AppID", IsRequired = true)] public string AppID { get { return this["AppID"] as string; } set { this["AppID"] = value; } } [ConfigurationProperty("AppSecret", IsRequired = true)] public string AppSecret { get { return this["AppSecret"] as string; } set { this["AppSecret"] = value; } } }
рдлреЗрд╕рдмреБрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВ
- рдЙрддреНрддрд░ рдПрдХ рдкрд╣реБрдВрдЪ рдЯреЛрдХрди рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдо рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдореЗрдВ рд╕реНрд╡рдпрдВ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓рддреА рд╣реИ
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдВ рдЬрд┐рд╕реЗ рд╣рдорд╛рд░рд╛ FacebookSetting рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдЧрд╛ (рддрд╛рдХрд┐ рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рд╣реЛ) (LessonProject.FacebookAPI / IFbAppConfig.cs):
public interface IFbAppConfig { string AppID { get; } string AppSecret { get; } }
FacebookSetting рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ (/Global/Config/FacebookSetting.cs):
public class FacebookSetting : ConfigurationSection, IFbAppConfig
рд╣рдорд╛рд░реЗ AppID рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рддрд░рд╣ рдЪрд▓рддреЗ рд╣реИрдВ:
https://www.facebook.com/dialog/oauth?client_id=136398216534301&redirect_uri=http%3A%2F%2Flocalhost%3A54484%2FFacebook%2FToken&scope=email
рдФрд░ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдпрджрд┐ рд╣рдо "рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдЬрд╛рдПрдВ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ - рддреЛ рд╣рдо рдкреГрд╖реНрда рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ
localhost:54484/Facebook/Token
localhost:54484/Facebook/Token
рдХреЛрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде
localhost:54484/Facebook/Token
, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡реА рд░рд╣рд╛ рд╣реИ)ред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рдкрд░ рдЕрдорд▓ рдХрд░рддреЗ рд╣реИрдВ:
https://graph.facebook.com/oauth/access_token?client_id=136398216534301&redirect_uri=http://localhost:54484/Facebook/Token&client_secret=e6de78fd40596f00e225dce861b34a1a&code=AQAScKUYKGpzwijzT3Y3SHjNOd4Q5nsyrYPdJaPhX-88r-wBOuMrdimL8h82bGv3HAh7TL6oJyZ0gNgiB8BcCeH8G_Zj7h6hlft_BFbOfIJIZJB9nKW6Q4iR3a0VVImxM0QYJas3eVg4qtYNkqUcWbgXDSK2JENcuomUX38haxFUFdKXrVjL1acNZSocESsx6nfx_FyF_QlbwnUO5cwogrLp
рд╣рдореЗрдВ рдХреНрдпрд╛ рдЬрд╡рд╛рдм рдорд┐рд▓реЗрдЧрд╛:
access_token=AAAB8Da8ZBmR0BAMCOx5293ZArYvFu5oRkmZCrwZAbvpWZB3ZCLBeiooslyYPZBVwHjxSpe3KzJ4VLFPIxwwf0D6TIEiM5ApzU8EMoDpOxE4uAZDZD&expires=5183977
рд╣рдореЗрдВ рдЗрд╕ access_token рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕рд╣реЗрдЬреЗрдВ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╣рдо рд▓рд┐рдВрдХ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ:
https:
рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡рд╣ рд╣рдореЗрдВ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ:
{"id":"708770020","name":"Andrey Chernikov","first_name":"Andrey","last_name":"Chernikov","link":"http:\/\/www.facebook.com\/chernikov1","username":"chernikov1","gender":"male","email":"chernikov\u0040gmail.com","timezone":2,"locale":"ru_RU","verified":true,"updated_time":"2013-03-06T15:01:28+0000"}
рдФрд░ рдпрд╣рд╛рдБ рд╣рдо рдЗрд╕реЗ FbUserInfo рд╡рд░реНрдЧ (LessonProject.FacebookAPI / FbUserInfo.cs) рдкрд░ рд▓рд╛рддреЗ рд╣реИрдВ:
[JsonObject] public class FbUserInfo { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("first_name")] public string FirstName { get; set; } [JsonProperty("last_name")] public string LastName { get; set; } [JsonProperty("link")] public string Link { get; set; } [JsonProperty("username")] public string UserName { get; set; } [JsonProperty("gender")] public string Gender { get; set; } [JsonProperty("email")] public string Email { get; set; } [JsonProperty("locale")] public string Locale { get; set; } [JsonProperty("timezone")] public double? Timezone { get; set; } [JsonProperty("verified")] public bool? Verified { get; set; } [JsonProperty("updated_time")] public DateTime? updatedTime { get; set; } }
рд╣рдо FbProvider.cs (LessonProject.FacebookAPI / Provider.cs) рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдХрд╛рдо рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
public class FbProvider { private static string AuthorizeUri = "https://graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri={1}&scope=email"; private static string GetAccessTokenUri = "https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&client_secret={2}&code={3}"; private static string GetUserInfoUri = "https://graph.facebook.com/me?access_token={0}"; private static string GraphUri = "https://graph.facebook.com/{0}"; public IFbAppConfig Config { get; set; } public string AccessToken { get; set; } public string Authorize(string redirectTo) { return string.Format(AuthorizeUri, Config.AppID, redirectTo); } public bool GetAccessToken(string code, string redirectTo) { var request = string.Format(GetAccessTokenUri, Config.AppID, redirectTo, Config.AppSecret, code); WebClient webClient = new WebClient(); string response = webClient.DownloadString(request); try { var pairResponse = response.Split('&'); AccessToken = pairResponse[0].Split('=')[1]; return true; } catch (Exception ex) { return false; } } public JObject GetUserInfo() { var request = string.Format(GetUserInfoUri, AccessToken); WebClient webClient = new WebClient(); string response = webClient.DownloadString(request); return JObject.Parse(response); } }
рдЬрд╣рд╛рдБ
- рдЕрдзрд┐рдХрд╛рд░ рдорд╛рдВрдЧрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдХрд╛ рдЧрдарди рдЕрдзрд┐рдХреГрдд рд╣реИред
- GetAccessToken рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рд╣реИред
- GetUserInfo рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо
WebClient.DownloadString
- рдФрд░ op-pa рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдЖрдВрддреНрд░ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдорд┐рд▓рд╛ред
рд╣рдо рдФрд░ рдЖрдЧреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред FacebookController рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдПрдВ (/Areas/Default/Controllers/FacebookController.cs):
public class FacebookController : DefaultController { private FbProvider fbProvider; protected override void Initialize(System.Web.Routing.RequestContext requestContext) { fbProvider = new FbProvider(); fbProvider.Config = Config.FacebookSetting; base.Initialize(requestContext); } public ActionResult Index() { return Redirect(fbProvider.Authorize("http://" + HostName + "/Facebook/Token")); } public ActionResult Token() { if (Request.Params.AllKeys.Contains("code")) { var code = Request.Params["code"]; if (fbProvider.GetAccessToken(code, "http://" + HostName + "/Facebook/Token")) { var jObj = fbProvider.GetUserInfo(); var fbUserInfo = JsonConvert.DeserializeObject<FbUserInfo>(jObj.ToString()); return View(fbUserInfo); } } return View("CantInitialize"); } }
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╣рдо
AppSecret
рдореЗрдВ
AppID
рдФрд░
AppSecret
рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж - рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХрд╛рд░ (рдЕрдиреБрдорддрд┐ рд╡рд┐рдВрдбреЛ) рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдлреЗрд╕рдмреБрдХ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╣рдореЗрдВ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рджреА рд╣реИ, рддреЛ 100 рдмрд╛рд░ рди рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП, рдлреЗрд╕рдмреБрдХ рд╣рдореЗрдВ рдкреГрд╖реНрда / рдлреЗрд╕рдмреБрдХ / рдЯреЛрдХрди рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрд╛, рддреЛ рджреЗрдЦреЗрдВ CantInitialize (/Areas/Default/Views/Facebook/CantInitialize.cshtml):
@{ ViewBag.Title = "CantInitialize"; Layout = "~/Areas/Default/Views/Shared/_Layout.cshtml"; } <h2>CantInitialize</h2> <h3> - </h3>
рдЕрдиреНрдпрдерд╛, рдЬрдм рд╕рдмрдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдирд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ fbProvider рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИ) рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ FbUserInfo рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ View (/Areas/Default/Views/Facebook/Token.cshtml) рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
@model LessonProject.FacebookAPI.FbUserInfo @{ ViewBag.Title = "Token"; Layout = "~/Areas/Default/Views/Shared/_Layout.cshtml"; } <h2></h2> <p> :</p> <dl class="dl-horizontal"> <dt>ID</dt> <dd>@Model.Id</dd> <dt>FirstName</dt> <dd>@Model.FirstName</dd> <dt>LastName</dt> <dd>@Model.LastName</dd> <dt>Link</dt> <dd>@Model.Link</dd> </dl>
рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб / рд╕рд░реНрд╡рд░ рдХреЛрдб (рдкреНрд░рд╡реЗрд╢-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐-рдЙрддреНрдкрддреНрддрд┐)
рдЖрдЗрдП рд╣рдо рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрдм рдпрд╣ рд╕рднреА рдЗрдВрдЯрд░реИрдХреНрд╢рди рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рдЕрдЬрд╛рдХреНрд╕ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЯреЛрдХрди рдкрджреНрдзрддрд┐ рдХрд╛ рдХреЛрдб рдмрджрд▓реЗрдВред рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдлрд╝реЗрд╕рдмреБрдХ рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреГрд╢реНрдп (/Areas/Default/Controllers/FacebookController.cs:Token) рдореЗрдВ рдЯреЛрдХрди рдкрд╛рд╕ рдХрд░реЗрдВ:
public ActionResult Token() { if (Request.Params.AllKeys.Contains("code")) { var code = Request.Params["code"]; if (fbProvider.GetAccessToken(code, "http://" + HostName + "/Facebook/Token")) { ViewBag.Token = fbProvider.AccessToken; return View(); } } return View("CantInitialize"); }
Token.cshtml (/Areas/Default/Views/Facebook/Token.cshtml) рдмрджрд▓реЗрдВ:
@{ ViewBag.Title = "Token"; Layout = "~/Areas/Default/Views/Shared/_Layout.cshtml"; } @section scripts { @Scripts.Render("~/Scripts/default/facebook-token.js") } @Html.Hidden("Token", ViewBag.Token as string) <h2></h2> <p> :</p> <dl class="dl-horizontal"> <dt>ID</dt> <dd id="ID"></dd> <dt>FirstName</dt> <dd id="FirstName"></dd> <dt>LastName</dt> <dd id="LastName"></dd> <dt>Link</dt> <dd id="Link"></dd> </dl>
Facebook-token.js (/ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ /default/facebook-token.js) рдЬреЛрдбрд╝реЗрдВ:
function FacebookToken() { _this = this; this.ajaxGetUserInfo = "https://graph.facebook.com/me?access_token="; this.init = function () { var token = $("#Token").val(); $.ajax({ type: "GET", dataType: 'json', url: _this.ajaxGetUserInfo + token, success: function (data) { $("#ID").text(data.id); $("#FirstName").text(data.first_name); $("#LastName").text(data.last_name); $("#Link").text(data.link); } }) } } var facebookToken = null; $().ready(function () { facebookToken = new FacebookToken(); facebookToken.init(); });
рднрд╛рдЧреЛ, рдЬрд╛рдВрдЪ рдХрд░реЛред рд╕рдм рдХреБрдЫ рдорд╣рд╛рди рд╣реИред рд▓реЗрдХрд┐рди http рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:

рдПрдХреНрд╕реЗрд╕-рдХрдВрдЯреНрд░реЛрд▓-рдЕрдиреБрдорддрд┐-рдЙрддреНрдкрддреНрддрд┐ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдЬреЛ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдкрд░, рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЛрдореЗрди рдкрд░ рд╣реЛрд╕реНрдЯ рдХреА рдЧрдИ рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдЕрдЬрд╛рдХреНрд╕ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпрд╛рдиреА рдпрджрд┐ рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ $ .ajax () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдпрд╣ рд╣реЗрдбрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдЬрд╛рд░реА рдХреА рдЬрд╛рддреА рд╣реИ:
Origin localhost:8080 is not allowed by Access-Control-Allow-Origin
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдПрдВ рдЬреЛ рдЗрд╕ рд╢реАрд░реНрд╖рдХ рдХреЛ рдЬреЛрдбрд╝реЗрдЧреА рдпрджрд┐ рд╣рдо рдЕрдиреНрдп рд╕рд╛рдЗрдЯреЛрдВ (/Attribute/AllowCrossSiteJson.cs) рд╕реЗ рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рддрдХ рдкрд╣реБрдВрдЪ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*"); base.OnActionExecuting(filterContext); } }
рдЙрдкрдпреЛрдЧ рдЬреЛрдбрд╝реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХреНрд╢рди рд╡рд┐рдзрд┐ рдареАрдХ рд╣реИ, рдЬреЛ рд╣рдореЗрд╢рд╛ {"рдкрд░рд┐рдгрд╛рдо": "рдУрдХреЗ"} (/Areas/Default/Controllers/HomeController.cs) рд▓реМрдЯреЗрдЧреА:
[AllowCrossSiteJson] public ActionResult OK() { return Json(new { result = "OK" }, JsonRequestBehavior.AllowGet); }
рдпрд╣ Json рдФрд░ facebook рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЖрдк рд╡реАрдХреЗ рдЖрдкреА рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рдмрд╛рддрдЪреАрдд рдХреЗ рд╕рд╛рде рдЕрднреНрдпрд╛рд╕ рдФрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рд▓реЗрдЦрди рдпрд╣рд╛рдБ рд╣реИ:
http://vk.com/developers.php ред
рд╕рднреА рд╕реНрд░реЛрдд
https://bitbucket.org/chernikov/lessons рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВ