locked
[C#] JSON RRS feed

  • Вопрос

  • Добрый день. 

    Никак не могу разобраться с  отправлением JSON строки в WinRT.
    По возможности поделитесь работающим примером кода.

    Спасибо.

    4 мая 2013 г. 6:16

Ответы

  • Вот пример класса для запроса:

        public class MyData
        {
            [DataMember(Name = "token")]
            public String Token { get; set; }
    
            [DataMember(Name = "msisdn")]
            public String Msisdn { get; set; }
    
            [DataMember(Name = "password")]
            public String Password { get; set; }
    
            public static MyData FromJson(String data)
            {
                MyData myData;
                var serializer = new DataContractJsonSerializer(typeof(MyData));
                using (var memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(data)))
                {
                    myData = serializer.ReadObject(memoryStream) as MyData;
                }
                return myData;
            }
    
            public static String ToJson(MyData myData)
            {
                String result;
                var serializer = new DataContractJsonSerializer(typeof(MyData));
                using (var memoryStream = new MemoryStream())
                {
                    serializer.WriteObject(memoryStream, myData);
                    result =  Encoding.UTF8.GetString(memoryStream.ToArray(), 0, (int)memoryStream.Length);
                }
                return result;
            }
        }
    

    Сам запрос выполняем следующим образом:

                var data = new MyData { Token = "b6aab5aa8d1649e69b3de19a62709742", Msisdn = "70000000022", Password = "123321" };
                var json = MyData.ToJson(data);
    
                var client = new HttpClient();
                const string link = "http://api.pub.emp.msk.ru:8081/json/v10.0/citizens/auth/loginbymsisdn";
                var response = await client.PostAsync(link, new StringContent(json));
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    var responseString = await response.Content.ReadAsStringAsync();
                }
                else
                {
                    throw new Exception(response.StatusCode.ToString() + " " + response.ReasonPhrase);
                }
    

    При этом ответ (HttpStatusCode.OK) будет такой:

    {"errorCode":403,"errorMessage":"Core::Authorization failed."}

    Никаких ошибок. Разобрать ответ можете по аналогии с классом MyData.

    Если делаете приложение на конкурс - удачи! :)

    • Помечено в качестве ответа _Михаил_ 5 мая 2013 г. 11:40
    5 мая 2013 г. 11:31

Все ответы

  • Куда вы хотите отправить JSON? Опишите свою задачу более конкретно.
    4 мая 2013 г. 20:31
  • Меня в общем интересует как это сделать под winrt.


    В моей конкретной задаче:

    http://dit.mos.ru/apps/dev

    К примеру, для авторизации в сервисе нужно отправить 

    {

    "token":"b6aab5aa8d1649e69b3de19a62709742",

    "msisdn":"70000000022",

    "password":"123321"

    }
    на
    http://api.pub.emp.msk.ru:8081/json/v10.0/citizens/auth/loginbymsisdn

    и получить ответ

    {

    "errorCode": 0,

    "errorMessage": "",

    "result": "56256d46cc747660bffd36e73b301f3c"

    }


    Под WinRT у меня это сделать не получается, не знаю почему, изучал разные статьи, все что я пробовал вызывает у меня различные ошибки при компиляции.

    5 мая 2013 г. 8:49
  • Вот пример класса для запроса:

        public class MyData
        {
            [DataMember(Name = "token")]
            public String Token { get; set; }
    
            [DataMember(Name = "msisdn")]
            public String Msisdn { get; set; }
    
            [DataMember(Name = "password")]
            public String Password { get; set; }
    
            public static MyData FromJson(String data)
            {
                MyData myData;
                var serializer = new DataContractJsonSerializer(typeof(MyData));
                using (var memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(data)))
                {
                    myData = serializer.ReadObject(memoryStream) as MyData;
                }
                return myData;
            }
    
            public static String ToJson(MyData myData)
            {
                String result;
                var serializer = new DataContractJsonSerializer(typeof(MyData));
                using (var memoryStream = new MemoryStream())
                {
                    serializer.WriteObject(memoryStream, myData);
                    result =  Encoding.UTF8.GetString(memoryStream.ToArray(), 0, (int)memoryStream.Length);
                }
                return result;
            }
        }
    

    Сам запрос выполняем следующим образом:

                var data = new MyData { Token = "b6aab5aa8d1649e69b3de19a62709742", Msisdn = "70000000022", Password = "123321" };
                var json = MyData.ToJson(data);
    
                var client = new HttpClient();
                const string link = "http://api.pub.emp.msk.ru:8081/json/v10.0/citizens/auth/loginbymsisdn";
                var response = await client.PostAsync(link, new StringContent(json));
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    var responseString = await response.Content.ReadAsStringAsync();
                }
                else
                {
                    throw new Exception(response.StatusCode.ToString() + " " + response.ReasonPhrase);
                }
    

    При этом ответ (HttpStatusCode.OK) будет такой:

    {"errorCode":403,"errorMessage":"Core::Authorization failed."}

    Никаких ошибок. Разобрать ответ можете по аналогии с классом MyData.

    Если делаете приложение на конкурс - удачи! :)

    • Помечено в качестве ответа _Михаил_ 5 мая 2013 г. 11:40
    5 мая 2013 г. 11:31
  • Спасибо большое, буду пробовать))
    5 мая 2013 г. 11:40
  • А как получить другой ответ? Сервис зарегистрирован с нужными функциями. Да даже получение открытых данных не работает( в ответ приходит json {"errorCode":403,"errorMessage":"Core::Authorization failed."}. Токен свой подставляю

    PS тестирую в fidler 2

    4 июля 2013 г. 12:57
  • Что значит другой ответ?

    токен свой. а id и password?

    4 июля 2013 г. 17:52
  • например хочу получить

    Метод получения списка справочников открытых данных

    Метод getall объекта catalog раздела opendata предназначен для получения списка справочников открытых данных.

    Пример использования метода

    Адрес: http://api.pub.emp.msk.ru:8081/json/v10.0/opendata/catalog/getall

    Тело запроса:

    {

    "token":"7da46cccb17d11e2b27c08002779b117"

    }

    токен свой подставляю.

    Но вместо ответа

    {

        "errorCode": 0,

        "errorMessage": "",

        "result": [ //куча информации

    ]}

    получаю ту ошибку 403

    5 июля 2013 г. 2:28
  • Работает. Через Fidler отправлял Get запрос вместо post
    8 июля 2013 г. 14:51