Я хочу сделать следующий curl
вызов в своем консольном приложении C #:
curl -d "text=This is a block of text" \
http://api.repustate.com/v2/demokey/score.json
Я попытался сделать как вопрос, размещенный здесь , но не могу правильно заполнить свойства.
Я также попытался преобразовать его в обычный HTTP-запрос:
http://api.repustate.com/v2/demokey/score.json?text="This%20is%20a%20block%20of%20text"
Могу ли я преобразовать вызов cURL в HTTP-запрос? Если да, то как? Если нет, как я могу правильно выполнить вышеуказанный вызов cURL из моего консольного приложения C #?
HttpClient
находится в соединении сейчас, и это будет способ получить HTTP контента через и идти вперед.HttpWebRequest
WebClient
Ответы:
Что ж, вы бы не стали вызывать cURL напрямую, скорее, вы бы использовали один из следующих вариантов:
HttpWebRequest
/HttpWebResponse
WebClient
HttpClient
(доступно начиная с .NET 4.5)Я настоятельно рекомендую использовать этот
HttpClient
класс, поскольку он спроектирован так, чтобы быть намного лучше (с точки зрения удобства использования), чем первые два.В вашем случае вы бы сделали это:
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()); }
Также обратите внимание, что этот
HttpClient
класс имеет гораздо лучшую поддержку для обработки различных типов ответов и лучшую поддержку асинхронных операций (и их отмены) по сравнению с ранее упомянутыми параметрами.источник
Task<T>
, вы можете просто не использовать,async
а затем нормально обрабатывать возвращаемые типы (вам придется вызыватьTask<T>.Result
. Обратите внимание, что лучше использоватьasync
хотя, поскольку вы тратите поток, ожидая результата.KeyValuePair<string, string>
вы бы просто использовалиnew [] { 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
Или в 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);
источник
Ниже приведен рабочий пример кода.
Обратите внимание, что вам нужно добавить ссылку на 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();
Ссылка: TheDeveloperBlog.com
источник
Я знаю, что это очень старый вопрос, но я публикую это решение на случай, если оно кому-то поможет. Я недавно столкнулся с этой проблемой, и Google привел меня сюда. Ответ здесь помогает мне понять проблему, но все еще есть проблемы из-за моей комбинации параметров. Что в конечном итоге решает мою проблему, так это преобразователь curl в C # . Это очень мощный инструмент, который поддерживает большинство параметров Curl. Код, который он генерирует, запускается практически сразу.
источник
Поздний ответ, но это то, чем я закончил. Если вы хотите запускать свои команды curl так же, как вы запускаете их в linux, и у вас Windows 10 или более поздняя версия, сделайте следующее:
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(); } } }
Причина, по которой код немного длиннее, заключается в том, что окна выдадут вам ошибку, если вы выполните одинарную кавычку. Другими словами, команда
curl 'https://google.com'
будет работать в Linux и не будет работать в Windows. Благодаря этому методу, который я создал, вы можете использовать одинарные кавычки и запускать свои команды curl точно так же, как вы запускаете их в Linux. Этот код также проверяет наличие экранирующих символов, таких как\'
и\"
.Например, используйте этот код как
var output = ExecuteCurl(@"curl 'https://google.com' -H 'Accept: application/json, text/javascript, */*; q=0.01'");
Если вы снова запустите ту же строку,
C:\Windows\System32\curl.exe
это не сработает, потому что по какой-то причине Windows не любит одинарные кавычки.источник
Вызывать cURL из консольного приложения - не лучшая идея.
Но вы можете использовать TinyRestClient, который упрощает создание запросов:
var client = new TinyRestClient(new HttpClient(),"https://api.repustate.com/"); client.PostRequest("v2/demokey/score.json"). AddQueryParameter("text", ""). ExecuteAsync<MyResponse>();
источник
Хорошо, если вы новичок в C # с cmd-line exp. вы можете использовать такие онлайн-сайты, как « https://curl.olsh.me/ », или поисковый преобразователь curl в C # вернет сайт, который может сделать это за вас.
или если вы используете почтальона, вы можете использовать «Создать фрагмент кода». Проблема только с генератором кода почтальона - это зависимость от библиотеки RestSharp.
источник