我正在尝试将一个csv文件和参数发送到http API,并且正在努力调试出错的地方。
对于仅需要参数的POST请求(没有csv文件),我可以成功执行此操作:
HttpContent upload = new FormUrlEncodedContent(new Dictionary<string, string> { { "name", "myName" }});
HttpResponseMessage uploadResponse = await client.PostAsync("api/datasets", upload);
对于需要参数和csv文件的POST请求,我使用的是MultipartFormDataContent:
var content = new MultipartFormDataContent();
HttpContent upload = new FormUrlEncodedContent(new Dictionary<string, string> { { "name", "myName" }});
content.Add(upload);
byte[] csvBytes = File.ReadAllBytes("myfile.csv");
var csvContent = new ByteArrayContent(csvBytes);
content.Add(csvContent, "csvfile", "datafile.csv");
HttpResponseMessage uploadResponse = await client.PostAsync("api/datasets", content);
但是,服务器现在返回一条消息,说我没有指定“name”参数。我错过了什么?如何正确提交参数?
答案 0 :(得分:0)
更改为
new Dictionary<string, string> { { "name", "myName" }}
到
new List<KeyValuePair<string, string>>({ "name", "myName" })
现在应该注意这个参数。
答案 1 :(得分:0)
在content.Add之前(csvContent,&#34; csvfile&#34;,&#34; datafile.csv&#34;); 添加以下行:
csvContent.Headers.Add("Content-Type", "text/csv");
csvContent.Headers.Add("Content-Disposition", "form-data; name=\"csvfile\"; filename=\"datafile.csv\"");
答案 2 :(得分:0)
这是我的猜测:
要包装一系列键/值对,应选择 application / x-www-form-urlencoded(FormUrlEncodedContent)或 multipart / form-data (MultipartFormDataContent)。如果同时使用两者,则将创建两个级别的框。
具体来说,您正在调用的API几乎肯定需要
multipart/form-data
subpart with name "parameter1" value "value1"
subpart with name "parameter2" value "value2"
subpart with name "csvfile" value <contents of datafile.csv>
但是你在给它
multipart/form-data
subpart with no name, value "parameter1=value1¶meter2=value2", content-type x-www-form-urlencoded
subpart with name "csvfile" value <contents of datafile.csv>
有关返回表单数据的两种方式的更完整说明,请参见What does enctype='multipart/form-data' mean?。