httr POST 请求到 API returns 400 错误
httr POST request to API returns 400 error
我正在使用 R 中的 httr 包尝试查询 postcode.io API (http://postcodes.io/docs).
我可以按照使用说明成功查询单个邮政编码:
sample4 <- GET("api.postcodes.io/postcodes/EN14RF")
当我尝试查询多个邮政编码时,我有点不知所措。 postcode.io 说明建议
POST https://api.postcodes.io/postcodes?q=[postcode]
其中指定了包含邮政编码数组的 JSON 对象。我有一个包含邮政编码的 R 向量,我试图将其转换为 JSON 对象:
a <- toJSON(a)
我的 R 向量 'a' 是:
structure(c(4L, 5L, 3L, 6L, 1L, 2L), .Label = c("Bn14 9aw", "CR0 4BE", "E5 8HB", "EN1 4RF", "G42 8QN", "SA1 3UL"), class = "factor")
现在,当我尝试使用以下代码行查询 API 时:
sample4 <- POST("https://api.postcodes.io/postcodes?q=[postcode]", body = list(postcode = add1JSON))
我得到一个错误:"Invalid JSON submitted. You need to submit a JSON object with an array of postcodes or geolocation objects"
我觉得这是因为我提供的不是数组,而是未命名的列表,例如我的 JSON 对象应该是这样的:
{"postcodes":"[ \"EN14RF\", \"G428QN\", \"E58HB\", \"SA13UL\", \"Bn149aw\", \"CR04BE\" ]"}
不是这个:"[ \"EN14RF\", \"G428QN\", \"E58HB\", \"SA13UL\", \"Bn149aw\", \"CR04BE\" ]"
谁能帮我解决这个问题?我感觉这与我的 toJSON
调用有关,但无法在论坛或 API 开发人员页面上找到类似的示例:(
非常感谢
马蒂
他们的 API 文档写得非常糟糕。这似乎是这个特定 API 调用的目的:
library(httr)
library(jsonlite)
library(dplyr)
post_codes <- c("Bn14 9aw", "CR0 4BE", "E5 8HB", "EN1 4RF", "G42 8QN", "SA1 3UL")
res <- POST("https://api.postcodes.io/postcodes",
body=list(postcodes=post_codes),
encode="json")
status_code(res)
## [1] 200
content(res, as="text") %>%
fromJSON(flatten=TRUE) %>%
glimpse()
## List of 2
## $ status: int 200
## $ result:'data.frame': 6 obs. of 29 variables:
## ..$ query : chr [1:6] "Bn14 9aw" "E5 8HB" "CR0 4BE" "EN1 4RF" ...
## ..$ result.postcode : chr [1:6] "BN14 9AW" "E5 8HB" "CR0 4BE" "EN1 4RF" ...
## ..$ result.quality : int [1:6] 1 1 1 1 1 1
## ..$ result.eastings : int [1:6] 514948 534934 531978 534957 264583 258092
## ..$ result.northings : int [1:6] 104386 185332 164963 199610 192273 662417
## ..$ result.country : chr [1:6] "England" "England" "England" "England" ...
## ..$ result.nhs_ha : chr [1:6] "South East Coast" "London" "London" "London" ...
## ..$ result.longitude : num [1:6] -0.3693 -0.0553 -0.1055 -0.0494 -3.9572 ...
## ..$ result.latitude : num [1:6] 50.8 51.6 51.4 51.7 51.6 ...
## ..$ result.parliamentary_constituency: chr [1:6] "East Worthing and Shoreham" "Hackney South and Shoreditch" "Croydon South" "Enfield North" ...
## ..$ result.european_electoral_region : chr [1:6] "South East" "London" "London" "London" ...
## ..$ result.primary_care_trust : chr [1:6] "West Sussex" "City and Hackney Teaching" "Croydon" "Enfield" ...
## ..$ result.region : chr [1:6] "South East" "London" "London" "London" ...
## ..$ result.lsoa : chr [1:6] "Worthing 008C" "Hackney 017B" "Croydon 024D" "Enfield 002E" ...
## ..$ result.msoa : chr [1:6] "Worthing 008" "Hackney 017" "Croydon 024" "Enfield 002" ...
## ..$ result.incode : chr [1:6] "9AW" "8HB" "4BE" "4RF" ...
## ..$ result.outcode : chr [1:6] "BN14" "E5" "CR0" "EN1" ...
## ..$ result.admin_district : chr [1:6] "Worthing" "Hackney" "Croydon" "Enfield" ...
## ..$ result.parish : chr [1:6] "Worthing, unparished area" "Hackney, unparished area" "Croydon, unparished area" "Enfield, unparished area" ...
## ..$ result.admin_county : chr [1:6] "West Sussex" NA NA NA ...
## ..$ result.admin_ward : chr [1:6] "Gaisford" "Homerton" "Waddon" "Turkey Street" ...
## ..$ result.ccg : chr [1:6] NA "NHS City and Hackney" "NHS Croydon" "NHS Enfield" ...
## ..$ result.nuts : chr [1:6] "West Sussex (South West)" "Hackney and Newham" "Croydon" "Enfield" ...
## ..$ result.codes.admin_district : chr [1:6] "E07000229" "E09000012" "E09000008" "E09000010" ...
## ..$ result.codes.admin_county : chr [1:6] "E10000032" "E99999999" "E99999999" "E99999999" ...
## ..$ result.codes.admin_ward : chr [1:6] "E05007698" "E05009376" "E05000167" "E05000211" ...
## ..$ result.codes.parish : chr [1:6] "E43000150" "E43000202" "E43000198" "E43000200" ...
## ..$ result.codes.ccg : chr [1:6] "E38000213" "E38000035" "E38000040" "E38000057" ...
## ..$ result.codes.nuts : chr [1:6] "UKJ27" "UKI41" "UKI62" "UKI54" ...
根据httr包的documentation,您需要将encode
参数设置为json
,如下所示:
url <- "https://api.postcodes.io/postcodes"
body <- list(a = 1, b = 2, c = 3)
# JSON encoded
r <- POST(url, body = body, encode = "json")
要查看实际请求,您可以使用交互式控制台中的 verbose()
参数:
POST(url, body = body, encode = "json", verbose())
您可以将任何 JSON 数组放入可以像这样通过 httr 传递的 R 格式:
body <- fromJSON("{"postcodes":"[ \"EN14RF\", \"G428QN\", \"E58HB\", \"SA13UL\", \"Bn149aw\", \"CR04BE\" ]"}")
然后 post:
sample4 <- POST("https://api.postcodes.io/postcodes?q=[postcode]",
body = body,
encode = "json")
我正在使用 R 中的 httr 包尝试查询 postcode.io API (http://postcodes.io/docs).
我可以按照使用说明成功查询单个邮政编码:
sample4 <- GET("api.postcodes.io/postcodes/EN14RF")
当我尝试查询多个邮政编码时,我有点不知所措。 postcode.io 说明建议
POST https://api.postcodes.io/postcodes?q=[postcode]
其中指定了包含邮政编码数组的 JSON 对象。我有一个包含邮政编码的 R 向量,我试图将其转换为 JSON 对象:
a <- toJSON(a)
我的 R 向量 'a' 是:
structure(c(4L, 5L, 3L, 6L, 1L, 2L), .Label = c("Bn14 9aw", "CR0 4BE", "E5 8HB", "EN1 4RF", "G42 8QN", "SA1 3UL"), class = "factor")
现在,当我尝试使用以下代码行查询 API 时:
sample4 <- POST("https://api.postcodes.io/postcodes?q=[postcode]", body = list(postcode = add1JSON))
我得到一个错误:"Invalid JSON submitted. You need to submit a JSON object with an array of postcodes or geolocation objects"
我觉得这是因为我提供的不是数组,而是未命名的列表,例如我的 JSON 对象应该是这样的:
{"postcodes":"[ \"EN14RF\", \"G428QN\", \"E58HB\", \"SA13UL\", \"Bn149aw\", \"CR04BE\" ]"}
不是这个:"[ \"EN14RF\", \"G428QN\", \"E58HB\", \"SA13UL\", \"Bn149aw\", \"CR04BE\" ]"
谁能帮我解决这个问题?我感觉这与我的 toJSON
调用有关,但无法在论坛或 API 开发人员页面上找到类似的示例:(
非常感谢
马蒂
他们的 API 文档写得非常糟糕。这似乎是这个特定 API 调用的目的:
library(httr)
library(jsonlite)
library(dplyr)
post_codes <- c("Bn14 9aw", "CR0 4BE", "E5 8HB", "EN1 4RF", "G42 8QN", "SA1 3UL")
res <- POST("https://api.postcodes.io/postcodes",
body=list(postcodes=post_codes),
encode="json")
status_code(res)
## [1] 200
content(res, as="text") %>%
fromJSON(flatten=TRUE) %>%
glimpse()
## List of 2
## $ status: int 200
## $ result:'data.frame': 6 obs. of 29 variables:
## ..$ query : chr [1:6] "Bn14 9aw" "E5 8HB" "CR0 4BE" "EN1 4RF" ...
## ..$ result.postcode : chr [1:6] "BN14 9AW" "E5 8HB" "CR0 4BE" "EN1 4RF" ...
## ..$ result.quality : int [1:6] 1 1 1 1 1 1
## ..$ result.eastings : int [1:6] 514948 534934 531978 534957 264583 258092
## ..$ result.northings : int [1:6] 104386 185332 164963 199610 192273 662417
## ..$ result.country : chr [1:6] "England" "England" "England" "England" ...
## ..$ result.nhs_ha : chr [1:6] "South East Coast" "London" "London" "London" ...
## ..$ result.longitude : num [1:6] -0.3693 -0.0553 -0.1055 -0.0494 -3.9572 ...
## ..$ result.latitude : num [1:6] 50.8 51.6 51.4 51.7 51.6 ...
## ..$ result.parliamentary_constituency: chr [1:6] "East Worthing and Shoreham" "Hackney South and Shoreditch" "Croydon South" "Enfield North" ...
## ..$ result.european_electoral_region : chr [1:6] "South East" "London" "London" "London" ...
## ..$ result.primary_care_trust : chr [1:6] "West Sussex" "City and Hackney Teaching" "Croydon" "Enfield" ...
## ..$ result.region : chr [1:6] "South East" "London" "London" "London" ...
## ..$ result.lsoa : chr [1:6] "Worthing 008C" "Hackney 017B" "Croydon 024D" "Enfield 002E" ...
## ..$ result.msoa : chr [1:6] "Worthing 008" "Hackney 017" "Croydon 024" "Enfield 002" ...
## ..$ result.incode : chr [1:6] "9AW" "8HB" "4BE" "4RF" ...
## ..$ result.outcode : chr [1:6] "BN14" "E5" "CR0" "EN1" ...
## ..$ result.admin_district : chr [1:6] "Worthing" "Hackney" "Croydon" "Enfield" ...
## ..$ result.parish : chr [1:6] "Worthing, unparished area" "Hackney, unparished area" "Croydon, unparished area" "Enfield, unparished area" ...
## ..$ result.admin_county : chr [1:6] "West Sussex" NA NA NA ...
## ..$ result.admin_ward : chr [1:6] "Gaisford" "Homerton" "Waddon" "Turkey Street" ...
## ..$ result.ccg : chr [1:6] NA "NHS City and Hackney" "NHS Croydon" "NHS Enfield" ...
## ..$ result.nuts : chr [1:6] "West Sussex (South West)" "Hackney and Newham" "Croydon" "Enfield" ...
## ..$ result.codes.admin_district : chr [1:6] "E07000229" "E09000012" "E09000008" "E09000010" ...
## ..$ result.codes.admin_county : chr [1:6] "E10000032" "E99999999" "E99999999" "E99999999" ...
## ..$ result.codes.admin_ward : chr [1:6] "E05007698" "E05009376" "E05000167" "E05000211" ...
## ..$ result.codes.parish : chr [1:6] "E43000150" "E43000202" "E43000198" "E43000200" ...
## ..$ result.codes.ccg : chr [1:6] "E38000213" "E38000035" "E38000040" "E38000057" ...
## ..$ result.codes.nuts : chr [1:6] "UKJ27" "UKI41" "UKI62" "UKI54" ...
根据httr包的documentation,您需要将encode
参数设置为json
,如下所示:
url <- "https://api.postcodes.io/postcodes"
body <- list(a = 1, b = 2, c = 3)
# JSON encoded
r <- POST(url, body = body, encode = "json")
要查看实际请求,您可以使用交互式控制台中的 verbose()
参数:
POST(url, body = body, encode = "json", verbose())
您可以将任何 JSON 数组放入可以像这样通过 httr 传递的 R 格式:
body <- fromJSON("{"postcodes":"[ \"EN14RF\", \"G428QN\", \"E58HB\", \"SA13UL\", \"Bn149aw\", \"CR04BE\" ]"}")
然后 post:
sample4 <- POST("https://api.postcodes.io/postcodes?q=[postcode]",
body = body,
encode = "json")