2014-11-20 89 views
1

我想访问美国人口普查地理编码批次地址的API,在这里找到:http://geocoding.geo.census.gov/geocoder/发布并R中使用HTTR从API接收数据

我也通过这里的API文档了:http://geocoding.geo.census.gov/geocoder/Geocoding_Services_API.pdf

我试图在R中使用httr包来发布使用以下格式的格式化地址的批量csv文件:唯一ID,街道地址,城市,州,邮编 我试过使用单个地址请求版本来自RCurl的getURL并且工作正常,但postForm似乎没有以正确的方式提交文件。我现在使用的代码似乎正确发布请求,但我没有收到任何地理编码数据。

curlhandle <- handle("http://geocoding.geo.census.gov/geocoder/geographies/addressbatch", 
    cookies = TRUE) 

# using fileUpload from RCurl instead of upload_file from httr 
upload3 <- fileUpload(contents = address100, contentType = "file") 

test <- POST(url="http://geocoding.geo.census.gov/geocoder/geographies/addressbatch", 
    body = list(addressFile = upload3, 
     benchmark = "Public_AR_Census2010", 
     vintage="Census2010_Census2010"), 
    encode = "multipart", 
    handle = curlhandle, 
    followLocation = TRUE, 
    verbose = TRUE) 

我的要求丢失了什么吗?我不确定在这种情况下是否应该使用写入功能& writedata。任何帮助,将不胜感激!

+0

你得到什么错误?什么是“address100”?你为什么使用'httr'而不是'upload_file'?尝试发布到http://httpbin.org/post来查看您的请求是否正确。 – Jeroen 2014-11-20 20:28:43

+0

谢谢!我得到的内容(测试)将是一个单独的字符串,表示“可能不是空”,表示请求已经通过,但以某种方式很糟糕,因此显示为空响应。我使用RCurl的fileUpload,因为upload_file似乎只接受文件的路径,而我试图上传一个R数据对象。 – Sandy 2014-11-22 03:59:20

回答

0

你似乎有一个奇怪的混合RCurl和HTTR。以下是我会写请求:

req <- POST(
    "http://geocoding.geo.census.gov/geocoder/geographies/addressbatch", 
    body = list(
    addressFile = upload_file(address100), 
    benchmark = "Public_AR_Census2010", 
    vintage = "Census2010_Census2010" 
), 
    encode = "multipart", 
    verbose()) 
stop_for_status(req) 
content(req) 

(也称“文件”是不是有效的MIME类型)

+0

非常感谢!这似乎工作,除了我不得不用一个路径替换地址100保存的csv文件。我试图用R中的对象使用upload_file,它会返回这个错误:错误:is.character(path)不是TRUE。 upload_file仅适用于文件路径吗? RCurl版本fileUpload是我以前使用的,我认为它会给出相同的输出,但接受R数据对象,但实际上当我尝试使用它时,它不起作用。两者有什么区别?据我了解,upload_file是fileUpload的包装。 – Sandy 2014-11-22 03:56:43

+0

'upload_file'的重点是_upload_存在于磁盘上的_file_。如果它不存在,它将不起作用。 – hadley 2014-11-22 20:49:52