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 saya pikir blok pengecualian sedang dipicu (karena ketika saya menghapus try-catch, saya mendapatkan pesan kesalahan server (500). Tapi saya tidak melihat Console.Out baris saya masukkan ke dalam catch block.
Konsol Saya:
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).
Saya menggunakan Visual Studio 2011 Beta, dan .NET 4.5 Beta.
Jawaban:
ASP.Net Web API telah menggantikan WCF Web API yang disebutkan sebelumnya.
Saya pikir saya akan mengirim jawaban yang diperbarui karena sebagian besar tanggapan ini berasal dari awal 2012, dan utas ini adalah salah satu hasil teratas ketika melakukan pencarian Google untuk "call restful service c #".
Pedoman saat ini dari Microsoft adalah dengan menggunakan Perpustakaan Klien API Web ASP.NET Microsoft untuk menggunakan layanan RESTful. Ini tersedia sebagai paket NuGet, Microsoft.AspNet.WebApi.Client. Anda perlu menambahkan paket NuGet ini ke solusi Anda.
Beginilah contoh Anda akan terlihat ketika diimplementasikan menggunakan Perpustakaan Klien API Web ASP.Net:
Jika Anda berencana membuat beberapa permintaan, Anda harus menggunakan kembali contoh HttpClient Anda. Lihat pertanyaan ini dan jawabannya untuk perincian lebih lanjut tentang mengapa pernyataan menggunakan tidak digunakan pada contoh HttpClient dalam kasus ini: Apakah HttpClient dan HttpClientHandler harus dibuang?
Untuk detail lebih lanjut, termasuk contoh-contoh lain, buka di sini: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client
Posting blog ini mungkin juga berguna: http://johnnycode.com/2012/02/23/consuming-your-own-asp-net-web-api-rest-service/
sumber
ReadAsAsync()
, tambahkan referensi keSystem.Net.Http.Formatting.dll
. (Intuitif, kan?)Saran saya adalah menggunakan RestSharp . Anda dapat membuat panggilan ke layanan REST dan meminta mereka untuk memasukkan objek POCO dengan kode boilerplate yang sangat sedikit untuk benar-benar harus menguraikan respons. Ini tidak akan menyelesaikan kesalahan khusus Anda, tetapi menjawab pertanyaan Anda secara keseluruhan tentang bagaimana melakukan panggilan ke layanan REST. Harus mengubah kode Anda untuk menggunakannya harus membayar dalam kemudahan penggunaan dan ketahanan bergerak maju. Itu hanya 2 sen saya sekalipun
Contoh:
sumber
Tidak terkait, saya yakin, tetapi bungkus
IDisposable
benda Anda dalamusing
balok untuk memastikan pembuangan yang benar:sumber
Berikut adalah beberapa cara berbeda memanggil API eksternal di C # (diperbarui 2019).
Cara-cara bawaan .NET:
Paket NuGet sumber terbuka gratis , yang sejujurnya memiliki pengalaman pengembang yang jauh lebih baik daripada .NET yang dibangun di klien:
Semua paket di atas memberikan pengalaman pengembang yang hebat (yaitu API ringkas, mudah) dan dirawat dengan baik.
(*) pada Agustus 2019
Contoh: Mendapatkan item Todo dari API Pemulihan Palsu menggunakan ServiceStack.Text. Perpustakaan lain memiliki sintaks yang sangat mirip.
Menjalankan contoh di atas dalam aplikasi .NET Core Console, menghasilkan output berikut.
Instal paket-paket ini menggunakan NuGet
sumber
Silakan gunakan kode di bawah ini untuk permintaan api REST Anda
sumber
Saya ingin membagikan solusi saya di ASP.NET Core
Untuk memposting gunakan sesuatu seperti ini:
Contoh untuk dihapus:
Contoh untuk mendapatkan daftar:
Contoh untuk mendapatkan hanya satu:
sumber
Pembaruan untuk memanggil REST API saat menggunakan .NET 4.5 atau .NET Core
Saya akan menyarankan DalSoft.RestClient (peringatan saya membuatnya). Alasannya adalah karena menggunakan pengetikan dinamis Anda dapat membungkus semuanya dalam satu panggilan lancar termasuk serialisasi / de-serialisasi. Di bawah ini adalah contoh PUT yang berfungsi:
sumber
DAPATKAN:
POS:
Catatan: Untuk membuat serial dan mendesignasi JSON, saya menggunakan paket Newtonsoft.Json NuGet.
sumber
Lihat Refit untuk melakukan panggilan ke layanan lain dari .net. Saya merasa sangat mudah digunakan: https://github.com/paulcbetts/refit
sumber
Ini adalah contoh kode yang pasti berfungsi. Butuh satu hari untuk membuat ini untuk membaca satu set objek dari layanan Istirahat:
RootObject adalah jenis objek yang saya baca dari layanan lainnya.
sumber
sumber
Saya melakukannya dengan cara sederhana ini, dengan web Api 2.0. Anda dapat menghapus UseDefaultCredentials.I menggunakannya untuk kasus penggunaan saya sendiri.
sumber
Karena Anda menggunakan Visual Studio 11 Beta, Anda ingin menggunakan yang terbaru dan terhebat. Web Api baru berisi kelas untuk ini.
Lihat HttpClient: http://wcf.codeplex.com/wikipage?title=WCF%20HTTP
sumber
Jawaban yang ditandai di sini menyarankan menggunakan HttpClient secara langsung dan membuangnya. Ini mungkin berhasil, tetapi cukup mudah untuk mengalami masalah dengan HttpClient jika Anda tidak menggunakannya dengan benar. Jika Anda akan menggunakan HttpClient, lebih baik Anda menyerahkan pembuatan / pembuangan HttpClients ke perpustakaan pihak ke-3 yang menggunakan pola pabrik. RestClient.Net adalah salah satu pustaka tersebut.
Muncul dengan pabrik HttpClient yang sangat dasar sehingga Anda tidak mengalami masalah soket habis,
Tetapi implementasi IHttpClientFactory dari Microsoft juga dapat digunakan untuk yang terbaru dan terbaik:
RestClient.Net memperhitungkan injeksi ketergantungan akun, ejekan, wadah IoC, unit testabilitas, dan yang terpenting adalah cepat. Saya sudah mencari-cari dan satu-satunya klien lain yang tampaknya bekerja dalam kapasitas yang sama adalah Flurl.Http
sumber
Langkah pertama adalah membuat kelas pembantu untuk klien http.
Kemudian Anda dapat menggunakan kelas ini dalam kode Anda.
ini adalah contoh bagaimana Anda memanggil api sisanya tanpa pembawa menggunakan kelas di atas.
ini contoh bagaimana Anda dapat memanggil api sisanya yang membutuhkan pembawa.
Anda juga dapat merujuk ke repo di bawah ini jika Anda ingin melihat contoh kerja tentang cara kerjanya.
https://github.com/mokh223/callApi
sumber