我正在处理一个记录稀少的美国人口普查批量地理编码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,因为我认为我可以从中找出其他人。
非常感谢任何见解。