Este es el código que tengo hasta ahora:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
using System.Net.Http;
using System.Web;
using System.Net;
using System.IO;
namespace ConsoleProgram
{
public class Class1
{
private const string URL = "https://sub.domain.com/objects.json?api_key=123";
private const string DATA = @"{""object"":{""name"":""Name""}}";
static void Main(string[] args)
{
Class1.CreateObject();
}
private static void CreateObject()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = DATA.Length;
StreamWriter requestWriter = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
requestWriter.Write(DATA);
requestWriter.Close();
try {
WebResponse webResponse = request.GetResponse();
Stream webStream = webResponse.GetResponseStream();
StreamReader responseReader = new StreamReader(webStream);
string response = responseReader.ReadToEnd();
Console.Out.WriteLine(response);
responseReader.Close();
} catch (Exception e) {
Console.Out.WriteLine("-----------------");
Console.Out.WriteLine(e.Message);
}
}
}
}
El problema es que creo que se está activando el bloque de excepción (porque cuando elimino el try-catch, recibo un mensaje de error del servidor (500). Pero no veo la consola. Fuera de las líneas que puse en el bloque catch.
Mi consola:
The thread 'vshost.NotifyLoad' (0x1a20) has exited with code 0 (0x0).
The thread '<No Name>' (0x1988) has exited with code 0 (0x0).
The thread 'vshost.LoadReference' (0x1710) has exited with code 0 (0x0).
'ConsoleApplication1.vshost.exe' (Managed (v4.0.30319)): Loaded 'c:\users\l. preston sego iii\documents\visual studio 11\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe', Symbols loaded.
'ConsoleApplication1.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
A first chance exception of type 'System.Net.WebException' occurred in System.dll
The thread 'vshost.RunParkingWindow' (0x184c) has exited with code 0 (0x0).
The thread '<No Name>' (0x1810) has exited with code 0 (0x0).
The program '[2780] ConsoleApplication1.vshost.exe: Program Trace' has exited with code 0 (0x0).
The program '[2780] ConsoleApplication1.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).
Estoy usando Visual Studio 2011 Beta y .NET 4.5 Beta.
Respuestas:
La API web ASP.Net ha reemplazado a la API web WCF mencionada anteriormente.
Pensé en publicar una respuesta actualizada, ya que la mayoría de estas respuestas son de principios de 2012, y este hilo es uno de los mejores resultados al hacer una búsqueda en Google para "llamar al servicio reparador c #".
La guía actual de Microsoft es utilizar las bibliotecas de cliente de API web de Microsoft ASP.NET para consumir un servicio RESTful. Está disponible como un paquete NuGet, Microsoft.AspNet.WebApi.Client. Deberá agregar este paquete NuGet a su solución.
Así es como se vería su ejemplo cuando se implementa usando la biblioteca de cliente ASP.Net Web API:
Si planea hacer varias solicitudes, debe volver a usar su instancia de HttpClient. Consulte esta pregunta y sus respuestas para obtener más detalles sobre por qué no se usó una instrucción de uso en la instancia de HttpClient en este caso: ¿Deben eliminarse HttpClient y HttpClientHandler?
Para obtener más detalles, incluidos otros ejemplos, vaya aquí: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client
Esta publicación de blog también puede ser útil: http://johnnycode.com/2012/02/23/consuming-your-own-asp-net-web-api-rest-service/
fuente
ReadAsAsync()
, agregue una referencia aSystem.Net.Http.Formatting.dll
. (Intuitivo, ¿verdad?)Mi sugerencia sería usar RestSharp . Puede realizar llamadas a los servicios REST y hacer que se conviertan en objetos POCO con muy poco código repetitivo para tener que analizar la respuesta. Esto no resolverá su error particular, pero responde a su pregunta general sobre cómo hacer llamadas a los servicios REST. Tener que cambiar su código para usarlo debería ser rentable en la facilidad de uso y la solidez en el futuro. Eso es solo mis 2 centavos
Ejemplo:
fuente
Sin relación, estoy seguro, pero envuelva sus
IDisposable
objetos enusing
bloques para garantizar la eliminación adecuada:fuente
Aquí hay algunas formas diferentes de llamar a una API externa en C # (actualizado 2019).
Formas integradas de .NET:
Paquetes NuGet gratuitos de código abierto , que francamente tienen una experiencia de desarrollador mucho mejor que los clientes integrados de .NET:
Todos los paquetes anteriores proporcionan una excelente experiencia de desarrollador (es decir, API conciso y fácil) y están bien mantenidos.
(*) a agosto de 2019
Ejemplo: Obtener un elemento de Todo de una API de Fake Rest usando ServiceStack.Text. Las otras bibliotecas tienen una sintaxis muy similar.
Ejecutar el ejemplo anterior en una aplicación .NET Core Console produce el siguiente resultado.
Instale estos paquetes usando NuGet
fuente
Utilice el siguiente código para su solicitud de API REST
fuente
Me gustaría compartir mi solución en ASP.NET Core
Para publicar usa algo como esto:
Ejemplo para borrar:
Ejemplo para obtener la lista:
Ejemplo para obtener solo uno:
fuente
Actualización para llamar a una API REST cuando se utiliza .NET 4.5 o .NET Core
Sugeriría DalSoft.RestClient (advertencia que lo creé). La razón es que, debido a que utiliza la tipificación dinámica, puede resumir todo en una llamada fluida, incluida la serialización / deserialización. A continuación se muestra un ejemplo de trabajo PUT:
fuente
OBTENER:
ENVIAR:
Nota: para serializar y desirialze JSON utilicé el paquete Newtonsoft.Json NuGet.
fuente
Echa un vistazo a Refit para hacer llamadas a servicios de descanso desde .net. Lo encontré muy fácil de usar: https://github.com/paulcbetts/refit
fuente
Este es un código de ejemplo que funciona con seguridad. Me llevó un día hacer esto para leer un conjunto de objetos del servicio Rest:
RootObject es el tipo de objeto que estoy leyendo del servicio de descanso.
fuente
fuente
Lo hice de esta manera simple, con la web Api 2.0. Puede eliminar UseDefaultCredentials. Lo utilicé para mis propios casos de uso.
fuente
Como está utilizando Visual Studio 11 Beta, querrá usar la última y mejor. La nueva Web Api contiene clases para esto.
Ver HttpClient: http://wcf.codeplex.com/wikipage?title=WCF%20HTTP
fuente
La respuesta marcada aquí sugiere usar HttpClient directamente y deshacerse de él. Esto podría funcionar, pero es bastante fácil encontrarse con problemas con HttpClient si no lo usa correctamente. Si va a usar HttpClient, es mejor que entregue la creación / eliminación de HttpClients a una biblioteca de terceros que use un patrón de fábrica. RestClient.Net es una de esas bibliotecas.
Viene con una fábrica de HttpClient muy básica para que no se encuentre con el problema de agotamiento del socket,
Pero la implementación IHttpClientFactory de Microsoft también se puede usar para lo último y lo mejor:
RestClient.Net tiene en cuenta la inyección de dependencia, la burla, los contenedores IoC, la capacidad de prueba de la unidad y, sobre todo, es rápido. He buscado y el único otro cliente que parece funcionar en una capacidad similar es Flurl.
fuente
El primer paso es crear la clase auxiliar para el cliente http.
Entonces puedes usar esta clase en tu código.
Este es un ejemplo de cómo llamar a la API de descanso sin portador utilizando la clase anterior.
Este es un ejemplo de cómo puede llamar a la API de resto que requiere portador.
También puede consultar el siguiente repositorio si desea ver el ejemplo de funcionamiento de cómo funciona.
https://github.com/mokh223/callApi
fuente