[英]cURL post to HTTPCLient C#
我正在尝试将文件发布到PushBullet API服务。
API的信息站点显示了一个示例:
curl -i https://api.pushbullet.com/api/pushes \
-u API_KEY:
-F device_iden=u1qSJddxeKwOGuGW
-F type=file
-F file=@test.txt
我正在尝试使用C#的HttpClient
进行操作
我知道如何使用Httpclient
和MultipartFormDataContent
来发布文件,但是如何添加device_iden并在客户端中输入信息?
我正在用这个
using (var content = new MultipartFormDataContent())
{
try
{
content.Add(new StreamContent(new FileStream(pathFile, FileMode.Open, FileAccess.Read)));
var resp = wc.PostAsync(new Uri(baseUri, "api/pushes"), content);
}
catch (Exception)
{
throw;
}
}
[[新添加]]
使用cURL和fiddler这将是POST
POST http://\/ HTTP/1.1
Authorization: Basic d45YQkxueWswSmxQRTYFjc1deUzNo8UtueVZpaktIZm34anVqdU9NZerWYmFlOp==
User-Agent: curl/7.33.0
Host: \
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 787
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------886f3981539a91b3
--------------------------886f3981539a91b3
Content-Disposition: form-data; name="device_iden"
ujuOMfjVbaedjz7O3P0Jl6
--------------------------886f3981539a91b3
Content-Disposition: form-data; name="type"
file
--------------------------886f3981539a91b3
Content-Disposition: form-data; name="file"; filename="img.gif"
Content-Type: application/octet-stream
GIF89a������@�;A�;A�;A�;B�<B�<������!�Created with GIMP�!�
��,����������x�����I��8KȻ�`(�$��h��l{�p�tm߮��x����P,���҃l:q���I���u�Mf����
��d�y}LG��{���J�>���W};������^�1�����������
--------------------------886f3981539a91b3--
在尝试了提琴手之后,终于可以发表那篇文章了:
第一:
public static void PushFile(string pathFile, string iddev)
{
string name = Path.GetFileName(pathFile);
using (var wc = GetClient())
{
using (var multiPartCont = new MultipartFormDataContent())
{
multiPartCont.Add(addStringContent("device_iden", iddev));
multiPartCont.Add(addStringContent("type","file"));
multiPartCont.Add(addStreamContent(new FileStream(pathFile,FileMode.Open),name ));
try
{
var resp = wc.PostAsync(new Uri(baseUri, "api/pushes"), multiPartCont);
Task<string> result = resp.Result.Content.ReadAsStringAsync();
//string resultado = result.Result;
}
catch (Exception)
{
throw;
}
}
}
}
然后创建字符串内容和流内容的方法
private static StreamContent addStreamContent(Stream stream, string filename )
{
var fileContent = new StreamContent(stream);
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "\"file\"",
FileName = "\""+filename+"\""
};
fileContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return fileContent;
}
private static StringContent addStringContent(string name, string content)
{
var fileContent = new StringContent(content);
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "\"" + name + "\""
};
return fileContent;
}
curl中的-u是http认证。 看来pushbullet希望您使用API密钥登录。 使用httpclient,您将使用;
httpClient.DefaultRequestHeaders.Authorization = CreateBasicHeader("username", "password");
其余的将是GET或POST变量(我不确定pushbullet期望什么)。 看起来在您的代码中已使用POST对其进行了设置。 因此,您可以使用;
"device_iden=u1qSJddxeKwOGuGW&type=file";
创建-u
数据的另一种方法是使用NetworkCredential
创建HttpClientHandler
。
var handler = new HttpClientHandler
{
Credentials = new NetworkCredential(API_KEY, "")
};
var client = new HttpClient(handler);
这将创建一个基本的HTTP身份验证标头
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.