【发布时间】:2018-06-13 13:00:00
【问题描述】:
我讨厌这个 API.... 文档指出:
POST /api/2/path/data/Documents/HTTP/1.1
内容类型:multipart/form-data
Content-Length:此处请求正文的长度
这里是多部分数据
所以我创建了这个:
public async Task<bool> UploadAsync(string path, string fileName, byte[] data)
{
EnforceBasicAuthentication();
var byteContent = new ByteArrayContent(data);
byteContent.Headers.Remove("Content-Type");
byteContent.Headers.Add("Content-Type", "multipart/form-data");
byteContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = fileName,
Name = "file"
};
var form = new MultipartFormDataContent
{
byteContent
};
var response = await _httpClient.PostAsync($"{_config.FtpUrl}/path/data/{_config.FtpPath}/{path}", form);
response.EnsureSuccessStatusCode();
return true;
}
但是每次我运行它时,我都会收到 400 bad request 错误。除此之外,它什么也没说。 看看我的代码,有什么看起来不对的地方吗?
我尝试了多种解决方案,但似乎都不起作用。 目前我有这个:
public async Task<bool> UploadAsync(string path, string fileName, byte[] data)
{
EnforceBasicAuthentication();
var boundary = "--------------------------" + DateTime.Now.Ticks.ToString("x");
var bytesContent = new ByteArrayContent(data);
var form = new MultipartFormDataContent();
form.Add(bytesContent, "file", fileName);
form.Headers.Remove("Content-Type");
form.Headers.TryAddWithoutValidation("Content-Type", $"multipart/form-data; boundary= { boundary }");
bytesContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");
var response = await _httpClient.PostAsync($"{_config.FtpUrl}/path/data/{_config.FtpPath}/{path}", form);
response.EnsureSuccessStatusCode();
return true;
}
但它仍然会引发 400 错误。 我已经配置了 Fiddler 并在 postman 中做了一个测试。 postman 中的测试运行良好。这是提琴手中的请求:
POST https://app.smartfile.com/api/2/path/data/eOrdering/GRE017HTTP/1.1
缓存控制:无缓存
邮递员令牌:8359aae8-f4e2-4864-b81a-0169fe3f2b62
授权:基本的bleh
用户代理:PostmanRuntime/7.1.1
接受:/
主机:app.smartfile.com
cookie:csrftoken=rsDaPbfwG070rwBFlhIWVvULcAqGW0GB;
sessionid=a744788776bfef3c44faf6eb5e2a2931
接受编码:gzip,放气
内容类型:多部分/表单数据;边界=--------------606952503302468487113354
内容长度:334
连接:关闭
----------------606952503302468487113354
内容配置:表单数据;名称="";文件名="S200-220311-20180606095501.ord"
内容类型:应用程序/八位字节流
274 274/1 |PAULA|00220311|STD|||尽快
1|23133|1313 131302 4.00|C|3.65|||12/06/18
----------------606952503302468487113354--
这是我的代码生成的:
POST https://app.smartfile.com/api/2/path/data/eOrdering/GRE017HTTP/1.1
授权:基本等等
内容类型:multipart/form-data;边界=-------------8d5d140cf824278
主机:app.smartfile.com
Cookie:csrftoken=NYOgu61I6ddqBgudQEhWNr27fJUEQFi3;
sessionid=6994ad9254ebc46e0611e6ac308d6c55
内容长度:375
--52343329-f101-43a2-b4bb-bfa9a4073f6e
内容配置:表单数据;名称=文件;文件名=3c3f1596-707b-4725-9766-25faf6124a35.rsl;文件名*=utf-8''3c3f1596-707b-4725-9766-25faf6124a35.rsl
内容类型:应用程序/八位字节流
失败|"价格发行号无效,必须大于0"|
1|23133|01/01/0001 00:00:00|0|0
--52343329-f101-43a2-b4bb-bfa9a4073f6e--
我仍然不知道它为什么会失败:(
【问题讨论】:
-
还验证并可能发布该 url + 查询。可以使用 PostMan 吗?
标签: c# httpclient