使用 HttpWebRequest 将参数传递给 json Web 服务

发布于 2024-10-14 05:57:41 字数 2897 浏览 3 评论 0原文

我在将参数传递给 Web 服务时遇到问题,除了 JSON 中的 POST 数据。我为此使用 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< /code> ,我收到错误号 2。

I am having a problem in passing parameters to webservice which except POST data in JSON. I am using HttpWebRequest for this, following is the code i have tried so far, but everytime server returns any of these two errors:

Error 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":[]}

Error 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":[]}]}

Here is the code:

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;
            }

If i use string data = "[login_handle:'username',login_pass:'password']"; instead of Dictionary<string, string> , i receive error number 2.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蹲墙角沉默 2024-10-21 05:57:41

没关系,我自己解决了这个问题,而不是使用字典类型,我使用了这样的匿名类型 var data = new { login_handle = "test", login_pass = "test" }; 它解决了我的问题。

Never mind, i solved it myself, instead of using Dictionary type i used anonymous type like this var data = new { login_handle = "test", login_pass = "test" }; and it solved my problem.

茶花眉 2024-10-21 05:57:41

您应该做的是创建一个 DataContract 类(我们将称为 JsonData),它有两个名为 login_handle 和 login_pass 的 DataMember。

然后,在 DataContractJsonSerializer 中,将 typeof(JsonData) 传递给构造函数。

此解决方案是最好的,因为您无法使用匿名类型创建复杂类型。此外,通过设置 DataContracts 的父级,您可以轻松创建复杂的 JSON。

What you should have done is create a DataContract class (we'll call JsonData) which has two DataMembers named login_handle and login_pass.

Then, in the DataContractJsonSerializer, pass typeof(JsonData) to the constructor.

This solution is the best because you cannot create complex types using an anonymous type. Also, by parenting your DataContracts you can easily create complex JSON.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文