servicio por enviar consume body c# json httpwebrequest

por - json llama con C#



send json object c# (5)

Estoy tratando de hacer una llamada JSON usando C #. Intenté crear una llamada, pero no funcionó:

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/", "+ " /"[email protected]/", "+ " /"MyTenDigitNumberWasHere/", "+ " /""+message+"/" " + " ] "+ "}"; StreamWriter writer = new StreamWriter(request.GetRequestStream()); writer.Write(json); writer.Close(); return true; }

Cualquier consejo sobre cómo hacer que esto funcione sería apreciado.


Aquí hay una variación de la respuesta de Shiv Kumar, usando Newtonsoft.Json (también conocido como 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", "[email protected]", "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; } }


En tu código no obtienes HttpResponse, por lo que no verás lo que el lado del servidor te devuelve.

necesita obtener la Respuesta similar a la forma en que obtiene (hace) la Solicitud. Asi que

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/", " + " /"[email protected]/", " + " /"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; } }

También noté en la documentación de pennysms que esperan un tipo de contenido de "text / json" y no de "application / json". Puede que eso no haga la diferencia, pero vale la pena intentarlo en caso de que no funcione.


Es solo una muestra de cómo publicar datos de Json y obtener datos de Json desde / hacia una API de reposo en BIDS 2008 utilizando System.Net.WebRequest y sin usar newtonsoft . Este es solo un código de muestra y definitivamente puede ser ajustado (bien probado y funciona y sirve para mi propósito de prueba como un amuleto). Es solo para darte una Idea . Quería este hilo, pero no pude encontrar, por lo tanto, publicando esto. Estas fueron mis principales fuentes de donde saqué esto. Enlace 1 y Enlace 2

Código que funciona (unidad probada)

//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);

Referencias en mi tarea de script de prueba dentro de BIDS 2008 (teniendo SP1 y 3.5 framework)


Si su función reside en un controlador mvc, puede usar el código siguiente con un objeto de diccionario de lo que desea convertir a json

Json(someDictionaryObj, JsonRequestBehavior.AllowGet);

También intente y consulte system.web.script.serialization.javascriptserializer si está utilizando .net 3.5

en cuanto a su solicitud web ... parece correcto a primera vista ...

Yo usaría algo como esto ...

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

Puede ser que usted pueda hacer que la cadena post y json sea un parámetro y usar esto como un método webrequest genérico para todas las llamadas.


simplemente continuando lo que @Mulki hizo con su código

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