সি # তে সিআরএল কল করা


89

আমি curlআমার সি # কনসোল অ্যাপ্লিকেশনটিতে নিম্নলিখিত কল করতে চাই :

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

আমি এখানে পোস্ট করা প্রশ্নের মতো করার চেষ্টা করেছি , তবে আমি সম্পত্তিগুলি সঠিকভাবে পূরণ করতে পারি না।

আমি এটিকে একটি নিয়মিত এইচটিটিপি অনুরোধে রূপান্তরিত করার চেষ্টাও করেছি:

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

আমি কি কোনও সিআরএল কলকে এইচটিটিপি অনুরোধে রূপান্তর করতে পারি? যদি তাই হয়, কিভাবে? যদি তা না হয় তবে আমি কিভাবে আমার সি # কনসোল অ্যাপ্লিকেশন থেকে উপরের সিআরএল কলটি সঠিকভাবে করতে পারি?



@DanielEarwicker: আমি বলতে চাই না যায়, তা শুধু এ কারণে যে HttpClientএখন মিশ্রণ মধ্যে, এবং এটা হতে যাচ্ছে পেতে HTTP- র মাধ্যমে কন্টেন্ট পথ এবং এগিয়ে যাচ্ছে। HttpWebRequestWebClient
ক্যাসপারওনে

উত্তর:


148

ঠিক আছে, আপনি সরাসরি সিআরএল কল করবেন না , বরং আপনি নিম্নলিখিত বিকল্পগুলির মধ্যে একটি ব্যবহার করবেন:

আমি 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ক্লাসটির বিভিন্ন প্রতিক্রিয়ার ধরণের হ্যান্ডেল করার জন্য আরও ভাল সমর্থন রয়েছে, এবং পূর্বে উল্লিখিত বিকল্পগুলির তুলনায় অ্যাসিনক্রোনাস অপারেশনগুলির (এবং তাদের বাতিলকরণ) এর জন্য আরও ভাল সমর্থন রয়েছে।


7
আমি আপনার কোডটি অনুরূপ সমস্যার জন্য অনুসরণ করার চেষ্টা করেছি তবে আমাকে ত্রুটি দেওয়া হচ্ছে যা অপেক্ষা কেবলমাত্র অ্যাসিঙ্ক পদ্ধতিতে সেট করা যেতে পারে?
জয়

@ জায়ে হ্যাঁ, অ্যাসিঙ্ক এবং অপেক্ষা একটি জুটি, আপনি অন্যটি ছাড়া একটি ব্যবহার করতে পারবেন না। এর অর্থ আপনাকে সমন্বিত পদ্ধতিটি তৈরি করতে হবে (যার মধ্যে এখানে কোনও নেই) অ্যাসিঙ্ক।
ক্যাস্পারওনে

4
@ জায়ে এই পদ্ধতিগুলির বেশিরভাগ ফিরে আসে Task<T>, আপনি কেবল ব্যবহার করতে পারবেন না asyncএবং তারপরে সাধারণত রিটার্নের ধরণেরগুলি মোকাবেলা করতে পারবেন (আপনাকে কল করতে হবে Task<T>.ResultNote দ্রষ্টব্য, আপনি asyncফলাফলের অপেক্ষায় থাকা থ্রেডটি নষ্ট করছেন বলে আপনি ব্যবহার করা ভাল ।
ক্যাস্পার ওয়ান

4
@ ম্যাক্সটিয়েল হ্যাঁ, এটির একটি অ্যারে KeyValuePair<string, string>যাতে আপনি কেবল ব্যবহার করেনnew [] { new KeyValuePair<string, string>("text", "this is a block of text"), new KeyValuePair<string, string>("activity[verb]", "testVerb") }
ক্যাস্পারনিউ

4
এটি কি এভাবে কল করার জন্য কাজ করতে পারে? curl -k -i -H "Accept: application/json" -H "X-Application: <AppKey>" -X POST -d 'username=<username>&password=<password>' https://identitysso.betfair.com/api/login
মারে হার্ট

25

বা বিশ্রামে :

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);

4
বেসিক ব্যবহারের উদাহরণ বাক্সের বাইরে কাজ করে না। রেস্টশার্প জঞ্জাল।
অ্যালেক্স জি

13

নীচে একটি কার্যকারী উদাহরণ কোড রয়েছে।

দয়া করে নোট করুন আপনার নিউটনসফট.জসন.লিনক-এ একটি রেফারেন্স যুক্ত করা দরকার

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


3

আমি জানি এটি একটি খুব পুরানো প্রশ্ন তবে এটি কারও সাহায্য করার ক্ষেত্রে আমি এই সমাধানটি পোস্ট করছি। আমি সম্প্রতি এই সমস্যাটির মুখোমুখি হয়েছি এবং গুগল আমাকে এখানে নিয়ে গেছে। এখানে উত্তরটি আমাকে সমস্যাটি বুঝতে সহায়তা করে তবে আমার প্যারামিটার সংমিশ্রণের কারণে এখনও সমস্যা রয়েছে। যা শেষ পর্যন্ত আমার সমস্যার সমাধান করে তা সি # কনভার্টারে কার্ল । এটি একটি খুব শক্তিশালী সরঞ্জাম এবং কার্লের জন্য বেশিরভাগ পরামিতিগুলিকে সমর্থন করে। এটি যে কোডটি জেনারেট করে তা প্রায় সঙ্গে সঙ্গে চালানো যায়।


4
আমি সেখানে কোনও সংবেদনশীল ডেটা (লেখার কুকিজের মতো) পেস্ট না করার বিষয়ে সতর্কতা অবলম্বন করব ...
আদি এইচ

2

দেরিতে প্রতিক্রিয়া তবে এটিই আমি শেষ করছি। আপনি যদি লিনাক্সটিতে চালিত করেন এবং আপনার উইন্ডোজ 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'লিনাক্সে কাজ করবে এবং এটি উইন্ডোতে কাজ করবে না। আমি যে পদ্ধতিটি তৈরি করেছি তার জন্য ধন্যবাদ আপনি একক উদ্ধৃতি ব্যবহার করতে পারেন এবং আপনার কার্ল কমান্ডগুলি ঠিক যেমন আপনি লিনাক্সে চালাতে পারেন তা চালাতে পারেন। এই কোডটি যেমন \'এবং এর মতো অক্ষরগুলি পালানোর জন্যও পরীক্ষা করে \"

উদাহরণস্বরূপ এই কোডটি ব্যবহার করুন

var output = ExecuteCurl(@"curl 'https://google.com' -H 'Accept: application/json, text/javascript, */*; q=0.01'");

আপনি যদি একই স্ট্রিংটি আবার চালনা করেন তবে C:\Windows\System32\curl.exeএটি কাজ করবে না কারণ কোনও কারণে উইন্ডোজ একক উদ্ধৃতি পছন্দ করে না।


0

আপনার কনসোল অ্যাপ্লিকেশন থেকে কল সিআরএল কল্পনা করা ভাল ধারণা নয়।

তবে আপনি TinyRestClient ব্যবহার করতে পারেন যা অনুরোধগুলি তৈরি করা সহজ করে:

var client = new TinyRestClient(new HttpClient(),"https://api.repustate.com/");

client.PostRequest("v2/demokey/score.json").
AddQueryParameter("text", "").
ExecuteAsync<MyResponse>();

0

আচ্ছা আপনি যদি সিএমডি-লাইন এক্সপ দিয়ে সি # তে নতুন হন। আপনি " https://curl.olsh.me/ " এর মতো অনলাইন সাইটগুলি ব্যবহার করতে পারেন বা সি # রূপান্তরকারীটিতে অনুসন্ধান কার্লগুলি এমন সাইট প্রত্যাবর্তন করবে যা আপনার পক্ষে এটি করতে পারে।

অথবা আপনি যদি পোস্টম্যান ব্যবহার করছেন তবে আপনি কোড স্নিপেট ব্যবহার করতে পারেন পোস্টম্যান কোড জেনারেটরের সমস্যা কেবল রেস্টশার্প লাইব্রেরির উপর নির্ভরশীলতা।


0

System.Net.Http যুক্ত করতে ভুলবেন না, বিশেষত যদি আপনি এই ত্রুটিটি পান:

তীব্রতার কোড বিবরণ প্রকল্পের ফাইল লাইন দমন স্থিতির ত্রুটি CS0246 'এইচটিটিপিপ্লায়েন্ট' টাইপ বা নামের নামটি পাওয়া যায়নি (আপনি কি কোনও নির্দেশিকা বা একটি সংসদীয় রেফারেন্স ব্যবহার করে অনুপস্থিত?) 1_default.aspx ডি: j প্রজেটোস es টেস্টস \ FacebookAPI \ FB- কাস্টমঅডিয়েন্স \ default.aspx.cs 56 অ্যাক্টিভ

এই ক্ষেত্রে আপনি চিৎকার:

  1. নুগেট থেকে সিস্টেম.নেট.এইচটিটিপি যুক্ত করুন: সরঞ্জামগুলির জন্য / নুগেট প্যাকেজ ম্যানেজার / সমাধানের জন্য ম্যানেজার নিউগেট প্যাকেজগুলি;
  2. System.Net.Http জন্য অনুসন্ধান করুন
  3. আপনার পৃষ্ঠার শীর্ষে ফলো কোডটি যুক্ত করুন: System.Net.Http ব্যবহার করে;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.