将POST卷曲到C#

时间:2018-09-21 11:52:43

标签: c# curl

我正在尝试找到一种方法,如何将curl命令传输到C#。

我需要从api获取令牌并将其保存到文件C:\ ... \ x.json \

然后,我想将令牌声明为变量,然后将其用于另一个curl POST请求中,以获取与之配合使用的数据。

卷曲:

curl -X POST "https://example.com" 
-H "accept: application/json" 
-H "Content-Type: application/json" 
-d {"username":"username","password":"password"}

我当前的尝试:

static void Main(string[] args)
{
    using (var httpClient = new HttpClient())
    {
        using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://example.com"))
        {
            request.Headers.TryAddWithoutValidation("Accept", "application/json");

            request.Content = new StringContent("{\"username\":\"username\",\"password\":\"password\"}", Encoding.UTF8, "application/json");

            var response = await httpClient.SendAsync(request);
        }
    }                        
}

我尝试了几种方法,但是都没有用。这是来自curl.olsh.me,但我也收到一些等待中的错误,我不知道该怎么办。 (我是C#的新手):

  

“ await”运算符只能在异步方法中使用。考虑使用“异步”修饰符标记此方法,并将其返回类型更改为“任务”。

curl -v输出:

    • 尝试10.0.0.0 ...
    • 设置了TCP_NODELAY
    • 已连接到example.com(10.0.0.0)端口443(#0)
    • ALPN,提供h2
    • ALPN,提供http / 1.1
    • 成功设置证书验证位置:
    • CAfile:C:\ Users \ lvrabel \ Downloads \ curl-7.60.0-win64-mingw \ curl-7.60.0-win64-mingw \ bin \ curl-ca-bundle.crt CApath:无
    • TLSv1.2(OUT),TLS握手,客户端问候(1):
    • TLSv1.2(IN),TLS握手,服务器问候(2):
    • TLSv1.2(IN),TLS握手,证书(11):
    • TLSv1.2(IN),TLS握手,服务器密钥交换(12):
    • TLSv1.2(IN),TLS握手,服务器完成(14):
    • TLSv1.2(OUT),TLS握手,客户端密钥交换(16):
    • TLSv1.2(OUT),TLS更改密码,客户端问候(1):
    • TLSv1.2(OUT),TLS握手,已完成(20):
    • TLSv1.2(IN),TLS握手,已完成(20):
    • 使用TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256的SSL连接
    • ALPN,服务器不同意协议
    • 服务器证书:
    • 主题:OU =域控制已验证; OU = PositiveSSL通配符; CN = *。example.com
    • 开始日期:2016年12月1日00:00:00 GMT
    • 到期日期:格林尼治标准时间2019年12月1日23:59:59
    • subjectAltName:主机“ example.com”与证书的“ * .example.com”匹配
    • 发卡人:C = GB; ST =大曼彻斯特; L =索尔福德; O = COMODO CA Limited; CN = COMODO RSA域验证安全服务器
    • SSL证书验证成功。
    • 上传完全发送出去:64个字节中的64个
    • TLSv1.2(OUT),TLS警报,客户端问候(1):

6 个答案:

答案 0 :(得分:2)

您必须设置主要方法async

static async void Main(string[] args)

如果您使用的C#版本<7.1,则不能直接在Main中使用任何等待。在这种情况下,您必须为其定义一个Task.Wait()(而不是为其定义await)。

Task task = ....;
task.Wait();
var result = task.Result;

答案 1 :(得分:1)

C#7中提供了异步主要方法。如果您使用的是较早版本,则可以像这样“手动”处理任务

var task = httpClient.SendAsync(request);
task.Wait();
var response = task.Result;
Console.WriteLine(response.Content.ReadAsStringAsync().Result);

答案 2 :(得分:1)

据我所知,您需要将用户名和密码转换为字节,并将其作为基数64字符串并将其传递给标头。当您使用await时,如果它是一个空方法,则应在其签名中添加带有Task的async修饰符,或者以防该方法返回比使用async Task更为复杂的类型,如示例所示。在这种情况下,您需要使用测试示例中所示的结果来获取结果。您可以在Microsoft文档中阅读有关此主题的更多信息。

代码如下:

public async Task<HttpResponseMessage> CreateAuthorization(string url, string username, string password)
{
    HttpResponseMessage response;

    using (var httpClient = new HttpClient())
    {
        using (var request = new HttpRequestMessage(new HttpMethod("POST"), url))
        {
            request.Headers.TryAddWithoutValidation("Accept", "application/json");
            var authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"));
            request.Headers.TryAddWithoutValidation("Authorization", $"Basic {authorization}");
            response = await httpClient.SendAsync(request);
        }
    }

    return response;
}

以下是测试示例:

public void CreateAuthorizationTest()
{
    var response = CreateAuthorization("https://example.com", "username", "password");
    var result = response.Result;
    var o = result.Content.ReadAsStringAsync();

    if (result.IsSuccessStatusCode)
    {
        //do some thing if success
        // you can do deserialization what ever
        Console.WriteLine(o);
    }
    else
    {
        //do some thing if error
        Console.WriteLine(o);
    }
    //etc.
}

链接:

答案 3 :(得分:0)

我使用System.Net.Http.Formatting.Extension

示例:

using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
// Add NuGet package System.Net.Http.Formatting.Extension
namespace SimpleRestCall
{
    class Program
    {
        static CancellationTokenSource cts = new CancellationTokenSource();

        static readonly string sitePath = "https://example.com";
        static void Main(string[] args)
        {
            using (var client = new HttpClient { BaseAddress = new Uri(sitePath), Timeout = new TimeSpan(0, 1, 0) })
            {
                Task.Run(() => Login(client)).Wait();
            }
        }

        private static async Task Login(HttpClient client)
        {
            string path = ""; // if it's a controller path put it here
            LoginData postData = new LoginData { username = "username", password = "password" };
            string json;
            using (HttpResponseMessage resp = await client.PostAsJsonAsync(path, postData, cts.Token))
            {
                json = await resp.Content.ReadAsStringAsync();
            }
            Console.WriteLine(json);
            Console.WriteLine("Press a key to finish");
            string aa = Console.ReadLine();
        }

        private class LoginData
        {
            public string username { get; set; }
            public string password { get; set; }
        }
    }
}

答案 4 :(得分:0)

更新:

我从服务器收到此响应:

  

状态码:200,原因短语:“确定”,版本:1.1,内容:System.Net.Http.StreamContent,标头:   {     日期:2018年9月25日星期二06:57:16 GMT     日期:2018年9月25日星期二06:57:17 GMT     连接方式:关闭     Set-Cookie:TS0119a36f = 015d56898097bc7f5dccb374f352898f8806da5833c9f8a8ef4ff6ae2a2b1d4e78147fb79479f8bf85929406f34372c41c63572a89;路径= /;域= .example.com     传输编码:分块     内容类型:application / json   }

我认为编码或idk存在一些问题。当我执行curl时,我得到此输出(我需要的输出):

  

{“代码”:200,“状态”:“成功”,“ sessionId”:“ 350bf800-bfdb-11e8-991a-d35510009464”}

当前代码:

    static void Main(string[] args)
    {
        using (var httpClient = new HttpClient())
        {
            using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.example.com"))
            {
                request.Headers.TryAddWithoutValidation("accept", "application/json");
                request.Content = new StringContent("{\"username\":\"user\",\"password\":\"pass\"}", Encoding.UTF8, "application/json");

                var task = httpClient.SendAsync(request);
                task.Wait();
                var response = task.Result;

                Console.WriteLine(response);
                Console.ReadKey();
            }
        }
    }

答案 5 :(得分:0)

使用此网站 https://curl.olsh.me/

using (var httpClient = new HttpClient())
{
    using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://example.com/"))
    {
        request.Headers.TryAddWithoutValidation("Accept", "application/json"); 

        request.Content = new StringContent("{\"username\":\"username\",\"password\":\"password\"}", Encoding.UTF8, "application/json"); 

        var response = await httpClient.SendAsync(request);
    }
}