передача параметров в веб-сервис json с использованием HttpWebRequest - PullRequest
1 голос
/ 27 января 2011

У меня проблема с передачей параметров в веб-сервис, который кроме POST данных в JSON.Я использую HttpWebRequest для этого, вот код, который я пробовал до сих пор, но каждый раз, когда сервер возвращает любую из этих двух ошибок:

Ошибка 1:

{"command":null,"handle":null,"code":2003,"msg":"Required parameter missing","error":["Parameter 'login_handle' missing.","Parameter 'login_pass' missing."],"params":{"0":{"Key":"login_handle","Value":"test"},"1":{"Key":"login_pass","Value":"test"},"handle":"example.com"},"svTRID":null,"response":[]}

Ошибка 2:

{"command":null,"handle":null,"code":2400,"msg":"Command failed","error":["Internal Server Error. resulted in the following error: array_key_exists() [<a href='function.array-key-exists'>function.array-key-exists<\/a>]: The second argument should be either an array or an object"],"params":[],"svTRID":null,"response":[],"children":[{"command":"Internal Server Error.","handle":null,"code":2400,"msg":"Command failed","error":["array_key_exists() [<a href='function.array-key-exists'>function.array-key-exists<\/a>]: The second argument should be either an array or an object"],"params":{"errno":2,"errstr":"array_key_exists() [<a href='function.array-key-exists'>function.array-key-exists<\/a>]: The second argument should be either an array or an object","errfile":"\/home\/ote\/httpapi\/v1\/index.php","errline":54},"svTRID":null,"response":[]}]}

Вот код:

try
            {
                ASCIIEncoding encoding = new ASCIIEncoding();


                Dictionary<string, string> data = new Dictionary<string, string>();
                data["login_handle"] = "test";
                data["login_pass"] = "test";               


                System.Net.WebRequest webReq = System.Net.WebRequest.Create(url);
                webReq.Method = "POST";
                webReq.ContentType = "application/json; charset=utf-8";
                DataContractJsonSerializer ser = new DataContractJsonSerializer(data.GetType());
                MemoryStream ms = new MemoryStream();
                ser.WriteObject(ms, data);
                String json = Encoding.UTF8.GetString(ms.ToArray());
                StreamWriter writer = new StreamWriter(webReq.GetRequestStream()); 
                writer.Write(json); 
                writer.Close();

                System.Net.WebResponse webResp = webReq.GetResponse();
                System.IO.StreamReader sr = new System.IO.StreamReader(webResp.GetResponseStream());
                string s = sr.ReadToEnd().Trim();
            }
            catch (Exception ex)
            {
                string e = ex.Message;
            }

Если я использую string data = "[login_handle:'username',login_pass:'password']"; вместо Dictionary<string, string>, я получаю ошибкуномер 2.

Ответы [ 2 ]

2 голосов
/ 27 января 2011

Не берите в голову, я решил это сам, вместо использования словарного типа, я использовал анонимный тип, подобный этому var data = new { login_handle = "test", login_pass = "test" };, и это решило мою проблему.

0 голосов
/ 29 июля 2011

Что вам нужно было сделать, это создать класс DataContract (мы будем называть его JsonData), который имеет двух членов DataMember с именами login_handle и login_pass.

Затем в DataContractJsonSerializer передайте typeof (JsonData) в конструктор.

Это лучшее решение, потому что вы не можете создавать сложные типы, используя анонимный тип. Кроме того, создавая родительские данные для ваших DataContracts, вы можете легко создавать сложные JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...