繁体   English   中英

如何在C#中将curl请求转换为WebRequest?

[英]How can I convert curl request to WebRequest in C#?

我正在尝试将CURL请求转换为C#中的WebRequest ,但由于总是返回401未经授权的错误,因此无法获得响应

在此处输入图片说明

这是工作curl请求:

curl -k -v https://api.demo.peertransfer.com/v1/transfers -H“内容类型:application / json” -X POST -d“ {\\” provider \\“:\\” HUL \\“, \\“ payment_destination \\”:\\“ hult-applicationfee \\”,\\“ amount \\”:\\“ 29000 \\”,\\“ callback_url \\”:\\“ http://studentapplication.local/zh/nextsteps \\”,\\“ callback_id \\ “:\\” abc1234546asas \\ “\\ ”dynamic_fields \\“:{\\ ”student_id数据\\“:\\ ”32453245 \\“,\\ ”student_first_name \\“:\\ ”糖果\\“,\\ ”student_last_name \\“:\\” 学生\\“}}” -H“ X-Peertransfer-Digest:zYUt + Pn0A06wsSbCrrbAZn68Aslq9CbSUAKBrUEwIzI =”

输出:

这是我需要进入webrequest的实际结果

红色框中的结果是我需要在WebRequest响应中获取的结果,这是我的C#代码

private void testnewfunc()
{
    string value = "{\"provider\":\"HUL\",\"payment_destination\":\"hult-applicationfee\",\"amount\":\"29000\",\"callback_url\":\"http://studentapplication.local/en/nextsteps\",\"callback_id\":\"abc1234546asas\",\"dynamic_fields\":{\"student_id\":\"32453245\",\"student_first_name\":\"Candy\",\"student_last_name\":\"Student\"}}";
    var URI = new Uri("https://api.demo.peertransfer.com/v1/transfers");
    byte[] data = System.Text.ASCIIEncoding.Default.GetBytes(value);
    var requst = (HttpWebRequest)WebRequest.Create(URI);
    requst.UserAgent = "curl/7.43.0";
    requst.Method = "POST";
    requst.KeepAlive = true;
    requst.AllowAutoRedirect = true;
    requst.ContentType = " application/json";
    requst.ContentLength = data.Length;
    // wc.Headers["Content-Type"] = "application/json";
    requst.Accept = "*/*";
    //Or any other encoding type.
    string result = System.Convert.ToBase64String(data);          

    var uname = "hultdemo2015";
    var pword = "gEejgC0GF8pCbI7C";
    var creds = string.Format("{0}:{1}", uname, pword);
    creds = Convert.ToBase64String(Encoding.ASCII.GetBytes(creds));

    requst.Headers["Authorization"] = string.Format("{0} {1}", "Basic", creds);            
    requst.Headers["X-Peertransfer-Digest"] = string.Format("{0}", "zYUt+Pn0A06wsSbCrrbAZn68Aslq9CbSUAKBrUEwIzI=");
    using (Stream stream = requst.GetRequestStream())
    {
        stream.Write(data, 0, data.Length);
    }
    var httpResponse = (HttpWebResponse)requst.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        var responseText = streamReader.ReadToEnd();
        //Now you have your response.
        //or false depending on information in the response
        // return true;
    }
}

不知道我在WebRequest做错了什么。

这是我的解决方案:

var client = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false });

var message = new HttpRequestMessage(HttpMethod.Post, new Uri("https://api.demo.peertransfer.com/v1/transfers"));
message.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
message.Headers.Add("X-Peertransfer-Digest", "zYUt+Pn0A06wsSbCrrbAZn68Aslq9CbSUAKBrUEwIzI=");
message.Content = new StringContent("{\"provider\":\"HUL\",\"payment_destination\":\"hult-applicationfee\",\"amount\":\"29000\",\"callback_url\":\"http://studentapplication.local/en/nextsteps\",\"callback_id\":\"abc1234546asas\",\"dynamic_fields\":{\"student_id\":\"32453245\",\"student_first_name\":\"Candy\",\"student_last_name\":\"Student\"}}", Encoding.UTF8, "application/json");
var responseMessage = await client.SendAsync(message);
MessageBox.Show(string.Format("Status Code: {0}{1}Content-Type: {2}{1}Date: {3}{1}Location:{4}", responseMessage.StatusCode, Environment.NewLine, responseMessage.Content.Headers.ContentType, responseMessage.Headers.Date, responseMessage.Headers.Location));

这是服务器的响应(与curl相同):

在此处输入图片说明

与.Net 4.0兼容的版本

var data = "{\"provider\":\"HUL\",\"payment_destination\":\"hult-applicationfee\",\"amount\":\"29000\",\"callback_url\":\"http://studentapplication.local/en/nextsteps\",\"callback_id\":\"abc1234546asas\",\"dynamic_fields\":{\"student_id\":\"32453245\",\"student_first_name\":\"Candy\",\"student_last_name\":\"Student\"}}";

var request = (HttpWebRequest)WebRequest.Create(new Uri("https://api.demo.peertransfer.com/v1/transfers"));
request.Method = "POST";
request.AllowAutoRedirect = false;
request.Accept = "*/*";
request.Headers.Add("X-Peertransfer-Digest", "zYUt+Pn0A06wsSbCrrbAZn68Aslq9CbSUAKBrUEwIzI=");
request.ContentType = "application/json";
request.ContentLength = data.Length;

using (var reqStream = request.GetRequestStream())
using (var writer = new StreamWriter(reqStream))
{
    writer.Write(data);
}

var response = request.GetResponse();
MessageBox.Show(response.Headers.ToString());

确保包括以下using语句:

using System.IO;
using System.Net;

这些是来自服务器的响应标头:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM