2011-01-27 4 views
1

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

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

0

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

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

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

Смежные вопросы