Ini adalah kode yang saya miliki sejauh ini:
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);
}
}
}
}
Masalahnya adalah bahwa saya pikir pengecualian blok dipicu (karena ketika saya menghapus try-catch, saya mendapatkan server error (500) pesan. Tapi aku don't melihat Konsol.Garis-garis aku menempatkan di menangkap blok.
Saya Console:
tidak ada Benang 'vshost.NotifyLoad' (0x1a20) telah keluar dengan kode 0 (0x0). Benang '<Tidak ada Nama>' (0x1988) telah keluar dengan kode 0 (0x0). Benang 'vshost.LoadReference' (0x1710) telah keluar dengan kode 0 (0x0). 'ConsoleApplication1.vshost.exe' (Managed (v4.0.30319)): Dimuat 'c:\users\l. preston sego iii\documents\visual studio 11\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe', simbol-Simbol yang sarat. 'ConsoleApplication1.vshost.exe' (Managed (v4.0.30319)): Dimuat 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll', Dilewati memuat simbol-simbol. Modul ini dioptimalkan dan debugger opsi 'Hanya Saya Kode' diaktifkan. Pertama kesempatan pengecualian jenis 'System.Net.WebException' terjadi di System.dll Benang 'vshost.RunParkingWindow' (0x184c) telah keluar dengan kode 0 (0x0). Benang '<Tidak ada Nama>' (0x1810) telah keluar dengan kode 0 (0x0). Program '[2780] ConsoleApplication1.vshost.exe: Program Jejak' telah keluar dengan kode 0 (0x0). Program '[2780] ConsoleApplication1.vshost.exe: Berhasil (v4.0.30319)' telah keluar dengan kode 0 (0x0).
I'm menggunakan Visual Studio 2011 Beta, dan .NET 4.5 Beta.
Yang ASP.Net Web API telah diganti WCF Web API yang telah disebutkan sebelumnya.
Saya pikir saya'd posting diperbarui jawabannya karena sebagian besar tanggapan ini dari awal tahun 2012, dan thread ini adalah salah satu hasil terbaik ketika melakukan pencarian Google untuk "panggilan layanan tenang c#".
Saat ini bimbingan dari Microsoft adalah dengan menggunakan Microsoft ASP.NET Web Pustaka Klien API untuk mengkonsumsi layanan Tenang. Ini tersedia sebagai paket NuGet, Microsoft.AspNet.WebApi.Klien. Anda akan perlu untuk menambahkan ini NuGet package untuk solusi anda.
Berikut ini's bagaimana contoh anda akan terlihat ketika diimplementasikan dengan menggunakan ASP.Net Web API Client Library:
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
namespace ConsoleProgram
{
public class DataObject
{
public string Name { get; set; }
}
public class Class1
{
private const string URL = "https://sub.domain.com/objects.json";
private string urlParameters = "?api_key=123";
static void Main(string[] args)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(URL);
// Add an Accept header for JSON format.
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
// List data response.
HttpResponseMessage response = client.GetAsync(urlParameters).Result; // Blocking call! Program will wait here until a response is received or a timeout occurs.
if (response.IsSuccessStatusCode)
{
// Parse the response body.
var dataObjects = response.Content.ReadAsAsync<IEnumerable<DataObject>>().Result; //Make sure to add a reference to System.Net.Http.Formatting.dll
foreach (var d in dataObjects)
{
Console.WriteLine("{0}", d.Name);
}
}
else
{
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
//Make any other calls using HttpClient here.
//Dispose once all HttpClient calls are complete. This is not necessary if the containing object will be disposed of; for example in this case the HttpClient instance will be disposed automatically when the application terminates so the following call is superfluous.
client.Dispose();
}
}
}
Jika anda berencana untuk membuat beberapa permintaan, anda harus kembali menggunakan HttpClient contoh. Melihat ini pertanyaan dan jawaban untuk rincian lebih lanjut tentang mengapa menggunakan pernyataan tidak digunakan pada HttpClient contoh dalam hal ini: https://stackoverflow.com/questions/15705092/do-httpclient-and-httpclienthandler-have-to-be-disposed
Untuk rincian lebih lanjut, termasuk contoh-contoh lain, pergi di sini: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client
Posting blog ini juga mungkin berguna: http://johnnycode.com/2012/02/23/consuming-your-own-asp-net-web-api-rest-service/
Saran saya akan menggunakan RestSharp. Anda dapat membuat panggilan ke layanan lain dan mereka dilemparkan ke POCO benda-benda dengan sangat sedikit kode boilerplate untuk benar-benar memiliki untuk mengurai melalui respon. Ini tidak akan memecahkan kesalahan tertentu, tapi jawaban anda secara keseluruhan pertanyaan tentang bagaimana untuk membuat panggilan ke layanan lain. Harus mengubah kode anda untuk menggunakannya harus membayar dalam kemudahan penggunaan dan ketahanan bergerak maju. Yang hanya saya 2 sen meskipun
Terkait, saya'm yakin, tapi jangan membungkus IDisposable
benda menggunakan
blok untuk memastikan pembuangan yang tepat:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
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;
using (Stream webStream = request.GetRequestStream())
using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
{
requestWriter.Write(DATA);
}
try
{
WebResponse webResponse = request.GetResponse();
using (Stream webStream = webResponse.GetResponseStream() ?? Stream.Null)
using (StreamReader responseReader = new StreamReader(webStream))
{
string response = responseReader.ReadToEnd();
Console.Out.WriteLine(response);
}
}
catch (Exception e)
{
Console.Out.WriteLine("-----------------");
Console.Out.WriteLine(e.Message);
}
}
}
}
Silakan gunakan kode di bawah ini untuk SISA permintaan api
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Json;
namespace ConsoleApplication2
{
class Program
{
private const string URL = "https://XXXX/rest/api/2/component";
private const string DATA = @"{
""name"": ""Component 2"",
""description"": ""This is a JIRA component"",
""leadUserName"": ""xx"",
""assigneeType"": ""PROJECT_LEAD"",
""isAssigneeTypeValid"": false,
""project"": ""TP""}";
static void Main(string[] args)
{
AddComponent();
}
private static void AddComponent()
{
System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
client.BaseAddress = new System.Uri(URL);
byte[] cred = UTF8Encoding.UTF8.GetBytes("username:password");
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(cred));
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
System.Net.Http.HttpContent content = new StringContent(DATA, UTF8Encoding.UTF8, "application/json");
HttpResponseMessage messge = client.PostAsync(URL, content).Result;
string description = string.Empty;
if (messge.IsSuccessStatusCode)
{
string result = messge.Content.ReadAsStringAsync().Result;
description = result;
}
}
}
}
Berikut adalah beberapa cara yang berbeda untuk memanggil API eksternal di C# (diperbarui 2019).
.NET's built-in cara:
Gratis, open-source Paket NuGet, yang terus terang jauh lebih baik pengalaman pengembang dari .NET's dibangun pada klien:
Semua paket diatas memberikan pengalaman pengembang (yaitu ringkas, mudah API) dan terpelihara dengan baik.
*()** pada bulan agustus 2019
Contoh: Mendapatkan item Todo dari Palsu Rest API menggunakan ServiceStack.Teks. Perpustakaan lainnya telah sangat mirip sintaks.
class Program
{
static void Main(string[] args)
{
// fake rest API
string url = "https://jsonplaceholder.typicode.com/todos/1";
// GET data from api & map to Poco
var todo = url.GetJsonFromUrl().FromJson<Todo>();
// print result to screen
todo.PrintDump();
}
public class Todo
{
public int UserId { get; set; }
public int Id { get; set; }
public string Title { get; set; }
public bool Completed { get; set; }
}
}
Menjalankan contoh di atas dalam .NET Inti aplikasi Konsol, menghasilkan output sebagai berikut.
* Menginstal paket-paket ini menggunakan NuGet**
Install-Package ServiceStack.Text, or
Install-Package RestSharp, or
Install-Package Flurl.Http
Update untuk memanggil SISA API saat menggunakan .NET 4.5 atau .NET Inti
Saya akan menyarankan DalSoft.RestClient (peringatan yang saya buat itu). Alasannya karena menggunakan dynamic typing anda dapat membungkus semuanya dalam satu fasih menyebut termasuk serialisasi/de-serialisasi. Di bawah ini adalah MENEMPATKAN contoh:
dynamic client = new RestClient("http://jsonplaceholder.typicode.com");
var post = new Post { title = "foo", body = "bar", userId = 10 };
var result = await client.Posts(1).Put(post);
Saya ingin berbagi solusi saya di ASP.NET Inti
using Newtonsoft.Json;
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
namespace WebApp
{
public static class HttpHelper
{
// In my case this is https://localhost:44366/
private static readonly string apiBasicUri = ConfigurationManager.AppSettings["apiBasicUri"];
public static async Task Post<T>(string url, T contentValue)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(apiBasicUri);
var content = new StringContent(JsonConvert.SerializeObject(contentValue), Encoding.UTF8, "application/json");
var result = await client.PostAsync(url, content);
result.EnsureSuccessStatusCode();
}
}
public static async Task Put<T>(string url, T stringValue)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(apiBasicUri);
var content = new StringContent(JsonConvert.SerializeObject(stringValue), Encoding.UTF8, "application/json");
var result = await client.PutAsync(url, content);
result.EnsureSuccessStatusCode();
}
}
public static async Task<T> Get<T>(string url)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(apiBasicUri);
var result = await client.GetAsync(url);
result.EnsureSuccessStatusCode();
string resultContentString = await result.Content.ReadAsStringAsync();
T resultContent = JsonConvert.DeserializeObject<T>(resultContentString);
return resultContent;
}
}
public static async Task Delete(string url)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(apiBasicUri);
var result = await client.DeleteAsync(url);
result.EnsureSuccessStatusCode();
}
}
}
}
Untuk posting menggunakan sesuatu seperti ini:
await HttpHelper.Post<Setting>($"/api/values/{id}", setting);
Contoh untuk menghapus:
await HttpHelper.Delete($"/api/values/{id}");
Contoh untuk mendapatkan daftar:
List<ClaimTerm> claimTerms = await HttpHelper.Get<List<ClaimTerm>>("/api/values/");
Contoh untuk mendapatkan hanya satu:
ClaimTerm processedClaimImage = await HttpHelper.Get<ClaimTerm>($"/api/values/{id}");
// GET JSON Response
public WeatherResponseModel GET(string url) {
WeatherResponseModel model = new WeatherResponseModel();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
try {
WebResponse response = request.GetResponse();
using(Stream responseStream = response.GetResponseStream()) {
StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
model = JsonConvert.DeserializeObject < WeatherResponseModel > (reader.ReadToEnd());
}
} catch (WebException ex) {
WebResponse errorResponse = ex.Response;
using(Stream responseStream = errorResponse.GetResponseStream()) {
StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
String errorText = reader.ReadToEnd();
// log errorText
}
throw;
}
return model;
}
// POST a JSON string
void POST(string url, string jsonContent) {
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
Byte[]byteArray = encoding.GetBytes(jsonContent);
request.ContentLength = byteArray.Length;
request.ContentType = @ "application/json";
using(Stream dataStream = request.GetRequestStream()) {
dataStream.Write(byteArray, 0, byteArray.Length);
}
long length = 0;
try {
using(HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
// got response
length = response.ContentLength;
}
} catch (WebException ex) {
WebResponse errorResponse = ex.Response;
using(Stream responseStream = errorResponse.GetResponseStream()) {
StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
String errorText = reader.ReadToEnd();
// log errorText
}
throw;
}
}
Catatan: Untuk cerita bersambung dan desirialze JSON aku digunakan Newtonsoft.Json paket NuGet.
Check out Mereparasi untuk membuat panggilan ke layanan lain dari .net. I've ternyata sangat mudah untuk menggunakan: https://github.com/paulcbetts/refit
Mereparasi: otomatis tipe-aman SISANYA perpustakaan .NET Inti, dan Xamarin .NET
Mereparasi adalah sebuah perpustakaan yang sangat terinspirasi oleh Square's Retrofit perpustakaan, dan ternyata anda SISA API ke dalam hidup interface:
public interface IGitHubApi {
[Get("/users/{user}")]
Task<User> GetUser(string user); } The RestService class generates an implementation of IGitHubApi that uses HttpClient to make its calls:
var gitHubApi = RestService.For<IGitHubApi>("https://api.github.com");
var octocat = await gitHubApi.GetUser("octocat");
Ini adalah contoh kode yang bekerja untuk yakin. Butuh beberapa hari untuk membuat ini untuk membaca satu set objek dari Sisa layanan:
RootObject adalah jenis objek Im membaca dari seluruh layanan.
string url = @"http://restcountries.eu/rest/v1";
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(IEnumerable<RootObject>));
WebClient syncClient = new WebClient();
string content = syncClient.DownloadString(url);
using (MemoryStream memo = new MemoryStream(Encoding.Unicode.GetBytes(content)))
{
IEnumerable<RootObject> countries = (IEnumerable<RootObject>)serializer.ReadObject(memo);
}
Console.Read();
var TakingRequset = WebRequest.Create("http://xxx.acv.com/MethodName/Get");
TakingRequset.Method = "POST";
TakingRequset.ContentType = "text/xml;charset=utf-8";
TakingRequset.PreAuthenticate = true;
//---Serving Request path query
var PAQ = TakingRequset.RequestUri.PathAndQuery;
//---creating your xml as per the host reqirement
string xmlroot=@"<root><childnodes>passing parameters</childnodes></root>";
string xmlroot2=@"<root><childnodes>passing parameters</childnodes></root>";
//---Adding Headers as requested by host
xmlroot2 = (xmlroot2 + "XXX---");
//---Adding Headers Value as requested by host
// var RequestheaderVales = Method(xmlroot2);
WebProxy proxy = new WebProxy("XXXXX-----llll", 8080);
proxy.Credentials = new NetworkCredential("XXX---uuuu", "XXX----", "XXXX----");
System.Net.WebRequest.DefaultWebProxy = proxy;
// Adding The Request into Headers
TakingRequset.Headers.Add("xxx", "Any Request Variable ");
TakingRequset.Headers.Add("xxx", "Any Request Variable");
byte[] byteData = Encoding.UTF8.GetBytes(xmlroot);
TakingRequset.ContentLength = byteData.Length;
using (Stream postStream = TakingRequset.GetRequestStream())
{
postStream.Write(byteData, 0, byteData.Length);
postStream.Close();
}
StreamReader stredr = new StreamReader(TakingRequset.GetResponse().GetResponseStream());
string response = stredr.ReadToEnd();
Aku melakukannya dengan cara sederhana ini, dengan Api web 2.0. Anda dapat menghapus UseDefaultCredentials.Saya menggunakan ini untuk saya gunakan sendiri kasus.
List<YourObject> listObjects = new List<YourObject>();
string response = "";
using (var client = new WebClient() { UseDefaultCredentials = true })
{
response = client.DownloadString(apiUrl);
}
listObjects = JsonConvert.DeserializeObject<List<YourObject>>(response);
return listObjects ;
langkah pertama adalah membuat class helper untuk http client.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace callApi.Helpers
{
public class CallApi
{
private readonly Uri BaseUrlUri;
private HttpClient client = new HttpClient();
public CallApi(string baseUrl)
{
BaseUrlUri = new Uri(baseUrl);
client.BaseAddress = BaseUrlUri;
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
}
public HttpClient getClient()
{
return client;
}
public HttpClient getClientWithBearer(string token)
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
return client;
}
}
}
Kemudian anda dapat menggunakan kelas ini dalam kode anda.
ini adalah contoh bagaimana anda call rest api tanpa pembawa menggunakan kelas atas.
// GET api/values
[HttpGet]
public async Task<actionResult<string>> postNoBearerAsync(string email, string password,string baseUrl, string action)
{
var request = new LoginRequest
{
email = email,
password = password
};
var callApi = new CallApi(baseUrl);
var client = callApi.getClient();
HttpResponseMessage response = await client.PostAsJsonAsync(action, request);
if (response.IsSuccessStatusCode)
return Ok(await response.Content.ReadAsAsync<string>());
else
return NotFound();
}
ini contoh bagaimana anda dapat call rest api yang memerlukan pembawa.
// GET api/values
[HttpGet]
public async Task<actionResult<string>> getUseBearerAsync(string token, string baseUrl, string action)
{
var callApi = new CallApi(baseUrl);
var client = callApi.getClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
HttpResponseMessage response = await client.GetAsync(action);
if (response.IsSuccessStatusCode)
{
return Ok(await response.Content.ReadAsStringAsync());
}
else
return NotFound();
}
anda juga dapat merujuk ke repo di bawah ini jika anda ingin melihat contoh kerja dari bagaimana hal itu bekerja.