2011-10-28 57 views
58

Tôi muốn thực hiện cuộc gọi curl sau trong C# console ứng dụng của tôi:Thực hiện cuộc gọi cURL trong C#

curl -d "text=This is a block of text" 
    http://api.repustate.com/v2/demokey/score.json 

tôi đã cố gắng để làm như câu hỏi được đăng here, nhưng tôi không thể điền vào các tính chất đúng cách.

Tôi cũng đã cố gắng để chuyển đổi nó vào một yêu cầu HTTP thông thường:

http://api.repustate.com/v2/demokey/score.json?text="This%20is%20a%20block%20of%20text" 

Tôi có thể chuyển đổi một cuộc gọi cURL để một yêu cầu HTTP? Nếu vậy, làm thế nào? Nếu không, làm thế nào tôi có thể thực hiện cuộc gọi cURL ở trên từ ứng dụng giao diện điều khiển C# của tôi đúng cách?

+0

thể trùng lặp của [Tải file sử dụng HttpRequest ] (http://stackoverflow.com/questions/4856895/downloading-files-using-httprequest) –

+0

@DanielEarwicker: Tôi muốn nói là không, chỉ vì 'HttpCli ent' hiện đang được trộn lẫn, và nó sẽ là * cách * để lấy nội dung HTTP qua 'HttpWebRequest' và' WebClient' trong tương lai. – casperOne

Trả lời

109

Vâng, bạn sẽ không gọi cURL trực tiếp, chứ không phải, bạn muốn sử dụng một trong các tùy chọn sau:

Tôi khuyên bạn nên sử dụng lớp học HttpClient, vì nó được thiết kế là mu ch tốt hơn (từ một quan điểm khả năng sử dụng) so với trước đây hai.

Trong trường hợp của bạn, bạn sẽ làm điều này:

using System.Net.Http; 

var client = new HttpClient(); 

// Create the HttpContent for the form to be posted. 
var requestContent = new FormUrlEncodedContent(new [] { 
    new KeyValuePair<string, string>("text", "This is a block of text"), 
}); 

// Get the response. 
HttpResponseMessage response = await client.PostAsync(
    "http://api.repustate.com/v2/demokey/score.json", 
    requestContent); 

// Get the response content. 
HttpContent responseContent = response.Content; 

// Get the stream of the content. 
using (var reader = new StreamReader(await responseContent.ReadAsStreamAsync())) 
{ 
    // Write the output. 
    Console.WriteLine(await reader.ReadToEndAsync()); 
} 

Cũng lưu ý rằng lớp HttpClient đã hỗ trợ tốt hơn để xử lý các loại phản ứng khác nhau, và hỗ trợ tốt hơn cho các hoạt động không đồng bộ (và hủy bỏ chúng) qua các tùy chọn được đề cập trước đó.

+4

Tôi đã thử theo mã của bạn cho một vấn đề tương tự nhưng tôi đang được đưa ra lỗi đang chờ đợi chỉ có thể được thiết lập để các phương pháp không đồng bộ? – Jay

+0

@Jay Có, không đồng bộ và đang đợi là một cặp, bạn không thể sử dụng cái này nếu không có cái kia. Điều này có nghĩa là bạn phải làm cho phương thức chứa (không có ở đây) không đồng bộ. – casperOne

+0

Tôi làm cách nào để kiểm tra phản hồi mà không cần đồng bộ? – Jay

7

Dưới đây là mã ví dụ hoạt động.

Xin lưu ý bạn cần phải thêm một tham chiếu đến Newtonsoft.Json.Linq

string url = "https://yourAPIurl" 
WebRequest myReq = WebRequest.Create(url); 
string credentials = "xxxxxxxxxxxxxxxxxxxxxxxx:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"; 
CredentialCache mycache = new CredentialCache(); 
myReq.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(credentials)); 
WebResponse wr = myReq.GetResponse(); 
Stream receiveStream = wr.GetResponseStream(); 
StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8); 
string content = reader.ReadToEnd(); 
Console.WriteLine(content); 
var json = "[" + content + "]"; // change this to array 
var objects = JArray.Parse(json); // parse as array 
foreach (JObject o in objects.Children<JObject>()) 
{ 
    foreach (JProperty p in o.Properties()) 
    { 
     string name = p.Name; 
     string value = p.Value.ToString(); 
     Console.Write(name + ": " + value); 
    } 
} 
Console.ReadLine(); 

tham khảo: TheDeveloperBlog.com

+0

Tôi không thể cảm ơn đủ, điều này làm việc hoàn hảo! Cảm ơn bạn! – Novastorm

8

Hoặc trong restSharp:

var client = new RestClient("https://example.com/?urlparam=true"); 
var request = new RestRequest(Method.POST); 
request.AddHeader("content-type", "application/x-www-form-urlencoded"); 
request.AddHeader("cache-control", "no-cache"); 
request.AddHeader("header1", "headerval"); 
request.AddParameter("application/x-www-form-urlencoded", "bodykey=bodyval", ParameterType.RequestBody); 
IRestResponse response = client.Execute(request); 
Các vấn đề liên quan