cURL - 在多部分表单字段中传递文件与传递该文件的确切内容之间的区别是什么?

时间:2018-06-19 04:06:11

标签: c# node.js curl postman

我正在处理一个记录稀少的美国人口普查批量地理编码API,它提供了一个单一的工作cURL请求作为示例。我正在尝试在应用程序中使用相同类型的请求,但我正在重新创建下面的工作示例:

curl --form addressFile=@localfile.csv --form benchmark=9 https://geocoding.geo.census.gov/geocoder/locations/addressbatch --output geocoderesult.csv

我的localfile.csv包含按其规格格式化的地址:1,100 Boylston Street,Boston,MA,02116。使用上面的cURL请求传递该文件可以正常工作,返回带有提供的地址+添加的地理位置数据的新CSV文件。

据我了解cURL规范,前面带有@的参数会在@后面的路径中读取文件的内容。我想如果我只是将那些确切的内容粘贴到表单数据字段(如下所示),我会看到相同的结果,如下所示:

curl --form addressFile='1,100 Boylston Street,Boston,MA,02116' --form benchmark=9 https://geocoding.geo.census.gov/geocoder/locations/addressbatch --output geocoderesult.csv

...但是上面的脚本会返回400错误,所以很明显我的假设是错误的,但我不确定有什么不同,或者如何在不实际创建文件的情况下重新创建相同的输入行为。

我无法在PostMan中重新创建工作请求(通过导入第一个cURL请求并将相同文件添加为“addressFile”或将文件内容粘贴到“addressFile”参数中作为文本)或使用node.js request库(通过将addressFile作为字节数组或字符串传递,这是我希望能够做到的)。

我之前使用以下代码在C#中使用了类似的逻辑:

// Set up form arguments for POST request
var content = new MultipartFormDataContent();

// Fake a file to pass to endpoint
var fileContent = new ByteArrayContent(addressesAsBytes);
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
    Name = "addressFile",
    FileName = "addresses.csv"
};
fileContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
content.Add(fileContent);

// Not a FormUrlEncodedContent class due to an ostensible bug in census API that
// rejects key/value formatting and requires 'benchmark' in a 'name' field
var benchMarkContent = new StringContent(Benchmark);
benchMarkContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
    Name = "benchmark"
};
content.Add(benchMarkContent);

var result = client.PostAsync("", content).Result;
string resultContent = result.Content.ReadAsStringAsync().Result;

你可以在上面看到我基本上'伪造'带有ByteArray的文件。我很乐意在cURL,node和PostMan中做同样的事情,特别是cURL,因为我认为我可以从中找出其他人。

非常感谢任何见解。

0 个答案:

没有答案