Chcę wykonać następujące curl
wywołanie w mojej aplikacji konsoli C #:
curl -d "text=This is a block of text" \
http://api.repustate.com/v2/demokey/score.json
Starałem się polubić zamieszczone tutaj pytanie , ale nie mogę poprawnie wypełnić właściwości.
Próbowałem też przekonwertować go na zwykłe żądanie HTTP:
http://api.repustate.com/v2/demokey/score.json?text="This%20is%20a%20block%20of%20text"
Czy mogę zamienić wywołanie cURL na żądanie HTTP? Jeśli tak to jak? Jeśli nie, w jaki sposób mogę poprawnie wykonać powyższe wywołanie cURL z mojej aplikacji konsoli C #?
HttpClient
jest w miksie teraz, i to będzie sposobem HTTP GET treści nad i posuwają się do przodu.HttpWebRequest
WebClient
Odpowiedzi:
Cóż, nie wywołałbyś bezpośrednio cURL , zamiast tego użyłbyś jednej z następujących opcji:
HttpWebRequest
/HttpWebResponse
WebClient
HttpClient
(dostępne od .NET 4.5)Gorąco polecam użycie tej
HttpClient
klasy, ponieważ została zaprojektowana tak, aby była znacznie lepsza (z punktu widzenia użyteczności) niż dwie poprzednie.W twoim przypadku zrobiłbyś to:
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()); }
Należy również zauważyć, że
HttpClient
klasa ma znacznie lepszą obsługę różnych typów odpowiedzi i lepszą obsługę operacji asynchronicznych (i ich anulowania) w porównaniu z wcześniej wymienionymi opcjami.źródło
Task<T>
, możesz po prostu nie używać,async
a następnie normalnie radzić sobie z typami zwracanymi (musiałbyś wywołaćTask<T>.Result
. Uwaga, lepiej jest użyćasync
chociaż, ponieważ marnujesz wątek czekając na wynik.KeyValuePair<string, string>
więc po prostu użyjesznew [] { new KeyValuePair<string, string>("text", "this is a block of text"), new KeyValuePair<string, string>("activity[verb]", "testVerb") }
curl -k -i -H "Accept: application/json" -H "X-Application: <AppKey>" -X POST -d 'username=<username>&password=<password>' https://identitysso.betfair.com/api/login
Lub w 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);
źródło
Poniżej znajduje się działający przykładowy kod.
Pamiętaj, że musisz dodać odwołanie do 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();
Źródła : TheDeveloperBlog.com
źródło
Wiem, że to bardzo stare pytanie, ale zamieszczam to rozwiązanie na wypadek, gdyby komuś pomogło. Niedawno spotkałem się z tym problemem i Google zaprowadziło mnie tutaj. Odpowiedź tutaj pomaga mi zrozumieć problem, ale nadal występują problemy z powodu mojej kombinacji parametrów. To, co ostatecznie rozwiązuje mój problem, to curl do konwertera C # . Jest to bardzo potężne narzędzie i obsługuje większość parametrów Curl. Kod, który generuje, jest prawie natychmiast uruchamialny.
źródło
Spóźniona odpowiedź, ale to właśnie zrobiłem. Jeśli chcesz uruchamiać polecenia curl bardzo podobnie, jak uruchamiasz je w systemie Linux, a masz system Windows 10 lub nowszy, zrób to:
public static string ExecuteCurl(string curlCommand, int timeoutInSeconds=60) { if (string.IsNullOrEmpty(curlCommand)) return ""; curlCommand = curlCommand.Trim(); // remove the curl keworkd if (curlCommand.StartsWith("curl")) { curlCommand = curlCommand.Substring("curl".Length).Trim(); } // this code only works on windows 10 or higher { curlCommand = curlCommand.Replace("--compressed", ""); // windows 10 should contain this file var fullPath = System.IO.Path.Combine(Environment.SystemDirectory, "curl.exe"); if (System.IO.File.Exists(fullPath) == false) { if (Debugger.IsAttached) { Debugger.Break(); } throw new Exception("Windows 10 or higher is required to run this application"); } // on windows ' are not supported. For example: curl 'http://ublux.com' does not work and it needs to be replaced to curl "http://ublux.com" List<string> parameters = new List<string>(); // separate parameters to escape quotes try { Queue<char> q = new Queue<char>(); foreach (var c in curlCommand.ToCharArray()) { q.Enqueue(c); } StringBuilder currentParameter = new StringBuilder(); void insertParameter() { var temp = currentParameter.ToString().Trim(); if (string.IsNullOrEmpty(temp) == false) { parameters.Add(temp); } currentParameter.Clear(); } while (true) { if (q.Count == 0) { insertParameter(); break; } char x = q.Dequeue(); if (x == '\'') { insertParameter(); // add until we find last ' while (true) { x = q.Dequeue(); // if next 2 characetrs are \' if (x == '\\' && q.Count > 0 && q.Peek() == '\'') { currentParameter.Append('\''); q.Dequeue(); continue; } if (x == '\'') { insertParameter(); break; } currentParameter.Append(x); } } else if (x == '"') { insertParameter(); // add until we find last " while (true) { x = q.Dequeue(); // if next 2 characetrs are \" if (x == '\\' && q.Count > 0 && q.Peek() == '"') { currentParameter.Append('"'); q.Dequeue(); continue; } if (x == '"') { insertParameter(); break; } currentParameter.Append(x); } } else { currentParameter.Append(x); } } } catch { if (Debugger.IsAttached) { Debugger.Break(); } throw new Exception("Invalid curl command"); } StringBuilder finalCommand = new StringBuilder(); foreach (var p in parameters) { if (p.StartsWith("-")) { finalCommand.Append(p); finalCommand.Append(" "); continue; } var temp = p; if (temp.Contains("\"")) { temp = temp.Replace("\"", "\\\""); } if (temp.Contains("'")) { temp = temp.Replace("'", "\\'"); } finalCommand.Append($"\"{temp}\""); finalCommand.Append(" "); } using (var proc = new Process { StartInfo = new ProcessStartInfo { FileName = "curl.exe", Arguments = finalCommand.ToString(), UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true, WorkingDirectory = Environment.SystemDirectory } }) { proc.Start(); proc.WaitForExit(timeoutInSeconds*1000); return proc.StandardOutput.ReadToEnd(); } } }
Powodem, dla którego kod jest trochę długi, jest to, że system Windows wyświetli błąd, jeśli wykonasz pojedynczy cytat. Innymi słowy, polecenie
curl 'https://google.com'
będzie działać na Linuksie i nie będzie działać w systemie Windows. Dzięki tej metodzie, którą stworzyłem, możesz używać pojedynczych cudzysłowów i uruchamiać polecenia curl dokładnie tak, jak uruchamiasz je na Linuksie. Ten kod sprawdza również znaki ucieczki, takie jak\'
i\"
.Na przykład użyj tego kodu jako
var output = ExecuteCurl(@"curl 'https://google.com' -H 'Accept: application/json, text/javascript, */*; q=0.01'");
Jeśli chcesz uruchomić ten sam ciąg,
C:\Windows\System32\curl.exe
to nie zadziała, ponieważ z jakiegoś powodu okna nie lubią pojedynczych cudzysłowów.źródło
Wywołanie cURL z aplikacji konsoli nie jest dobrym pomysłem.
Ale możesz użyć TinyRestClient, który ułatwia tworzenie żądań:
var client = new TinyRestClient(new HttpClient(),"https://api.repustate.com/"); client.PostRequest("v2/demokey/score.json"). AddQueryParameter("text", ""). ExecuteAsync<MyResponse>();
źródło
Cóż, jeśli jesteś nowy w C # z cmd-line exp. możesz skorzystać z witryn internetowych, takich jak „ https://curl.olsh.me/ ”, lub wyszukiwanie curl do konwertera C # zwróci witrynę, która może to zrobić za Ciebie.
lub jeśli używasz Postmana, możesz użyć Generuj fragment kodu, tylko problem z generatorem kodu Postman jest zależnością od biblioteki RestSharp.
źródło