使用 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
C# JSON 反序列化:如何从 JSON 对象数组中获取值 [重复]