Это код, который я до сих пор:
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);
}
}
}
}
Проблема в том, что я думаю, что блок исключения запускается (потому что, когда я удаляю try-catch, я получаю сообщение об ошибке сервера (500). Но я не вижу строк Console.Out, которые я помещаю в блок catch.
Моя Консоль:
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).
Я использую Visual Studio 2011 Beta и .NET 4.5 Beta.
Ответы:
Веб-API ASP.Net заменил веб-API WCF, упомянутый ранее.
Я решил опубликовать обновленный ответ, так как большинство из этих ответов относятся к началу 2012 года, и эта тема является одним из лучших результатов при поиске в Google слова "call restful service c #".
Текущее руководство от Microsoft заключается в использовании клиентских библиотек веб-API Microsoft ASP.NET для использования службы RESTful. Это доступно в виде пакета NuGet, Microsoft.AspNet.WebApi.Client. Вам нужно будет добавить этот пакет NuGet к вашему решению.
Вот как будет выглядеть ваш пример при реализации с использованием клиентской библиотеки ASP.Net Web API:
Если вы планируете делать несколько запросов, вам следует повторно использовать свой экземпляр HttpClient. См. Этот вопрос и ответы на него для получения более подробной информации о том, почему в этом случае оператор использования не использовался в экземпляре HttpClient: нужно ли удалять HttpClient и HttpClientHandler?
Более подробную информацию, включая другие примеры, можно найти здесь: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client
Этот блог также может быть полезен: http://johnnycode.com/2012/02/23/consuming-your-own-asp-net-web-api-rest-service/
источник
ReadAsAsync()
, добавьте ссылку наSystem.Net.Http.Formatting.dll
. (ИнтуитивноМое предложение будет использовать RestSharp . Вы можете делать вызовы к службам REST и приводить их к объектам POCO с очень небольшим количеством стандартного кода, чтобы фактически анализировать ответ. Это не решит вашу конкретную ошибку, но ответит на ваш общий вопрос о том, как совершать звонки в службы REST. Необходимость изменить свой код для его использования должна окупиться за счет простоты использования и надежности в будущем. Это только мои 2 цента, хотя
Пример:
источник
Я уверен, что они не связаны, но оберните ваши
IDisposable
объекты вusing
блоки, чтобы обеспечить надлежащую утилизацию:источник
Вот несколько разных способов вызова внешнего API в C # (обновлено 2019).
Встроенные способы .NET:
Бесплатные пакеты NuGet с открытым исходным кодом , которые, откровенно говоря, гораздо лучше для разработчиков, чем встроенные клиенты .NET:
Все вышеперечисленные пакеты предоставляют отличные возможности для разработчиков (то есть, краткий, простой API) и в хорошем состоянии.
(*) по состоянию на август 2019 года
Пример: получение элемента Todo из Fake Rest API с использованием ServiceStack.Text. Другие библиотеки имеют очень похожий синтаксис.
Выполнение приведенного выше примера в приложении .NET Core Console приводит к следующему выводу.
Установите эти пакеты, используя NuGet
источник
Пожалуйста, используйте код ниже для вашего запроса REST API
источник
Я хотел бы поделиться своим решением в ASP.NET Core
Для публикации используйте что-то вроде этого:
Пример для удаления:
Пример для получения списка:
Пример, чтобы получить только один:
источник
Обновление для вызова REST API при использовании .NET 4.5 или .NET Core
Я бы предложил DalSoft.RestClient (предостережение, что я его создал). Причина в том, что он использует динамическую типизацию, вы можете обернуть все в один свободный вызов, включая сериализацию / десериализацию. Ниже приведен рабочий пример PUT:
источник
ПОЛУЧИТЬ:
ПОЧТА:
Примечание. Для сериализации и десериализации JSON я использовал пакет Newtonsoft.Json NuGet.
источник
Проверьте Refit для совершения звонков на остальные услуги из .net. Я нашел это очень простым в использовании: https://github.com/paulcbetts/refit
источник
Это пример кода, который работает точно. Мне потребовался день, чтобы сделать это, чтобы прочитать набор объектов из сервиса Rest:
RootObject - это тип объекта, который я читаю из остального сервиса.
источник
источник
Я сделал это простым способом, с веб-Api 2.0. Вы можете удалить UseDefaultCredentials. Я использовал его для своих собственных случаев использования.
источник
Поскольку вы используете бета-версию Visual Studio 11, вы захотите использовать самые последние версии. Новый веб-интерфейс содержит классы для этого.
См. HttpClient: http://wcf.codeplex.com/wikipage?title=WCF%20HTTP
источник
Ответ, отмеченный здесь, предполагает непосредственное использование HttpClient и его утилизацию. Это может сработать, но довольно легко столкнуться с проблемами с HttpClient, если вы не используете его правильно. Если вы собираетесь использовать HttpClient, вам лучше передать создание / удаление HttpClients сторонней библиотеке, которая использует фабричный шаблон. RestClient.Net является одной из таких библиотек.
Он поставляется с очень простой фабрикой HttpClient, так что вы не столкнетесь с проблемой исчерпания сокетов,
Но реализация Microsoft IHttpClientFactory также может быть использована для самых последних и лучших:
RestClient.Net учитывает внедрение зависимостей, макетирование, контейнеры IoC, тестирование модулей и, прежде всего, быстрое. Я охотился вокруг, и единственный другой клиент, который, кажется, работает в подобной способности, является Flurl.
источник
Первым шагом является создание вспомогательного класса для клиента http.
Тогда вы можете использовать этот класс в своем коде.
это пример того, как вы называете остальные API без носителя, используя вышеуказанный класс.
Это пример того, как вы можете назвать остальные API, которые требуют предъявителя.
Вы также можете обратиться к репо ниже, если вы хотите увидеть рабочий пример того, как это работает.
https://github.com/mokh223/callApi
источник