使用 C# 调用 json [重复]

Posted

技术标签:

【中文标题】使用 C# 调用 json [重复]【英文标题】:json call with C# [duplicate] 【发布时间】:2011-06-26 08:21:49 【问题描述】:

我正在尝试使用 C# 制作 a json call。我尝试创建呼叫,但没有成功:

public bool SendAnSMSMessage(string message)

    HttpWebRequest request = (HttpWebRequest)
                             WebRequest.Create("http://api.pennysms.com/jsonrpc");
    request.Method = "POST";
    request.ContentType = "application/json";

    string json = " \"method\": \"send\", "+
                  "  \"params\": [ "+
                  "             \"IPutAGuidHere\", "+
                  "             \"msg@MyCompany.com\", "+
                  "             \"MyTenDigitNumberWasHere\", "+
                  "             \""+message+"\" " +
                  "             ] "+
                  "";

    StreamWriter writer = new StreamWriter(request.GetRequestStream());
    writer.Write(json);
    writer.Close();

    return true;

任何关于如何完成这项工作的建议将不胜感激。

【问题讨论】:

您是否遇到任何错误?你的message 是什么样的?您是否使用了正确的 API 密钥? @Drackir - 我使用了正确的 API 密钥(我使用电子邮件版本的 api 对其进行了测试,并且可以正常工作)。我没有收到任何错误。我只是没有收到短信。该消息只是一些简单的测试消息文本(“测试短信”(但没有引号))。 您的回复在哪里?您发出请求但不使用 GetResponseStream? @Vaccano,您使用的是哪个版本的 C#?如果您使用的是 3.5/4.0,您是否看过 WCF REST Starter 工具包?他们有一个 HttpClient 类,使调用 JSON(和其他)服务变得轻而易举。您不必纠结于原始的 HttpWebRequest 等。查看此文档 msdn.microsoft.com/en-us/library/ee391967.aspx 滚动到使用 HttpClient 使用 RESTful 服务部分(朝向底部。 @Vaccano,查看他们要求内容类型为 text/json 的便士 SMS 文档。不确定这是否会有所不同,但您应该在代码中进行更改。 【参考方案1】:

在您的代码中,您没有收到 HttpResponse,因此您不会看到服务器端发回给您的内容。

您需要以类似于获取(发出)请求的方式来获取响应。所以

public static bool SendAnSMSMessage(string message)

  var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://api.pennysms.com/jsonrpc");
  httpWebRequest.ContentType = "text/json";
  httpWebRequest.Method = "POST";

  using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
  
    string json = " \"method\": \"send\", " +
                      "  \"params\": [ " +
                      "             \"IPutAGuidHere\", " +
                      "             \"msg@MyCompany.com\", " +
                      "             \"MyTenDigitNumberWasHere\", " +
                      "             \"" + message + "\" " +
                      "             ] " +
                      "";

    streamWriter.Write(json);
  
  var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
  using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
  
    var responseText = streamReader.ReadToEnd();
    //Now you have your response.
    //or false depending on information in the response
    return true;        
  

我还在 pennysms 文档中注意到,他们期望内容类型为“text/json”而不是“application/json”。这可能没有什么不同,但值得一试,以防它不起作用。

【讨论】:

text/json 我在找什么。我有一个休息服务,由于应用程序/json,它总是返回 xml。 ???【参考方案2】:

只是继续 @Mulki 用他的代码所做的事情

public string WebRequestinJson(string url, string postData)

    string ret = string.Empty;

    StreamWriter requestWriter;

    var webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest;
    if (webRequest != null)
    
        webRequest.Method = "POST";
        webRequest.ServicePoint.Expect100Continue = false;
        webRequest.Timeout = 20000;

        webRequest.ContentType = "application/json";
        //POST the data.
        using (requestWriter = new StreamWriter(webRequest.GetRequestStream()))
        
            requestWriter.Write(postData);
        
    

    HttpWebResponse resp = (HttpWebResponse)webRequest.GetResponse();
    Stream resStream = resp.GetResponseStream();
    StreamReader reader = new StreamReader(resStream);
    ret = reader.ReadToEnd();

    return ret;

【讨论】:

【参考方案3】:

这是 Shiv Kumar 的答案的变体,使用 Newtonsoft.Json(又名 Json.NET):

public static bool SendAnSMSMessage(string message)

    var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://api.pennysms.com/jsonrpc");
    httpWebRequest.ContentType = "text/json";
    httpWebRequest.Method = "POST";

    var serializer = new Newtonsoft.Json.JsonSerializer();
    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
    
        using (var tw = new Newtonsoft.Json.JsonTextWriter(streamWriter))
        
             serializer.Serialize(tw, 
                 new method= "send",
                      @params = new string[]
                          "IPutAGuidHere", 
                          "msg@MyCompany.com",
                          "MyTenDigitNumberWasHere",
                          message
                      );
        
    
    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    
        var responseText = streamReader.ReadToEnd();
        //Now you have your response.
        //or false depending on information in the response
        return true;        
    

【讨论】:

【参考方案4】:

如果您的函数位于 mvc 控制器中,您可以将以下代码与您想要转换为 json 的字典对象一起使用

Json(someDictionaryObj, JsonRequestBehavior.AllowGet);

如果您使用的是 .net 3.5,也请尝试查看 system.web.script.serialization.javascriptserializer

至于您的网络请求...乍一看似乎还可以..

我会用这样的东西..

public void WebRequestinJson(string url, string postData)
    
    StreamWriter requestWriter;

    var webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest;
    if (webRequest != null)
    
        webRequest.Method = "POST";
        webRequest.ServicePoint.Expect100Continue = false;
        webRequest.Timeout = 20000;

        webRequest.ContentType = "application/json";
        //POST the data.
        using (requestWriter = new StreamWriter(webRequest.GetRequestStream()))
        
            requestWriter.Write(postData);
        
    

也许您可以将 post 和 json 字符串作为参数,并将其用作所有调用的通用 webrequest 方法。

【讨论】:

这有什么意义:var webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest; 为什么不只是:HttpWebRequest webRequest = System.Net.WebRequest.Create(url); @Drackir,WebRequest 是一个抽象类。它的(静态)Create 方法(本质上是一个工厂方法)根据 Uri 方案创建适当类的实例。这意味着如果 Uri 方案被确定为“http”,那么它将创建为 HttpWebRequest 的实例。如果是“ftp”,它将创建一个 FtpWebRequest 实例。通过执行“as”,变量 webRequest 被键入为 HttpWebRequest 的实例,因此特定于该类的属性和方法将可用。那有意义吗?我会调用变量 httpWebRequest(只是为了更清楚)。 这是 MSDN 文档,以防万一。 msdn.microsoft.com/en-us/library/bw00b1dc.aspx 唉,我没有使用 MVC。不过,我会尝试您对我的网络请求的更改。【参考方案5】:

它只是一个示例,说明如何使用 System.Net.WebRequest 和不使用 newtonsoft 在 BIDS 2008 中向/从 Rest API 发布 Json 数据和获取 Json 数据。这只是一个示例代码,绝对可以进行微调(经过良好测试,它可以工作并且像魅力一样为我的测试目的服务)。它只是给你一个想法。我想要这个线程,但找不到因此发布这个。这些是我从中提取这个的主要来源。 Link 1 和 Link 2

有效的代码(单元测试)

           //Get Example
            var httpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create("https://abc.def.org/testAPI/api/TestFile");
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = "GET";

            var username = "usernameForYourApi";
            var password = "passwordForYourApi";

            var bytes = Encoding.UTF8.GetBytes(username + ":" + password);
            httpWebRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(bytes));
            var httpResponse = (System.Net.HttpWebResponse)httpWebRequest.GetResponse();
            using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
            
                string result = streamReader.ReadToEnd();
                Dts.Events.FireInformation(3, "result from readng stream", result, "", 0, ref fireagain);
            


            //Post Example
            var httpWebRequestPost = (System.Net.HttpWebRequest)System.Net.WebRequest.Create("https://abc.def.org/testAPI/api/TestFile");
            httpWebRequestPost.ContentType = "application/json";
            httpWebRequestPost.Method = "POST";
            bytes = Encoding.UTF8.GetBytes(username + ":" + password);
            httpWebRequestPost.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(bytes));

            //POST DATA newtonsoft didnt worked with BIDS 2008 in this test package
            //json https://***.com/questions/6201529/how-do-i-turn-a-c-sharp-object-into-a-json-string-in-net
            // fill File model with some test data
            CSharpComplexClass fileModel = new CSharpComplexClass();
            fileModel.CarrierID = 2;
            fileModel.InvoiceFileDate = DateTime.Now;
            fileModel.EntryMethodID = EntryMethod.Manual;
            fileModel.InvoiceFileStatusID = FileStatus.NeedsReview;
            fileModel.CreateUserID = "37f18f01-da45-4d7c-a586-97a0277440ef";
            string json = new JavaScriptSerializer().Serialize(fileModel);
            Dts.Events.FireInformation(3, "reached json", json, "", 0, ref fireagain);
            byte[] byteArray = Encoding.UTF8.GetBytes(json);
            httpWebRequestPost.ContentLength = byteArray.Length;
            // Get the request stream.  
            Stream dataStream = httpWebRequestPost.GetRequestStream();
            // Write the data to the request stream.  
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.  
            dataStream.Close();
            // Get the response.  
            WebResponse response = httpWebRequestPost.GetResponse();
            // Display the status.  
            //Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            Dts.Events.FireInformation(3, "Display the status", ((HttpWebResponse)response).StatusDescription, "", 0, ref fireagain);
            // Get the stream containing content returned by the server.  
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.  
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.  
            string responseFromServer = reader.ReadToEnd();
            Dts.Events.FireInformation(3, "responseFromServer ", responseFromServer, "", 0, ref fireagain);

我在 BIDS 2008 中的测试脚本任务中的引用(具有 SP1 和 3.5 框架)

【讨论】:

以上是关于使用 C# 调用 json [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用传递json c#的Rest Service [重复]

C# JSON 反序列化:如何从 JSON 对象数组中获取值 [重复]

使用 C# 在复杂的 JSON 数组中查找和打印重复项

带有 JSON 文件的 C# 类 [重复]

如何使用 C# 在 POST 请求中发送 json 数据 [重复]

在C#中将对象转换为JSON字符串[重复]