#json #api #post #julia
#json #API #Публикация #julia
Вопрос:
Я пытаюсь преобразовать некоторый код Python в Julia. Вот код Python:
url = "http://api.scb.se/OV0104/v1/doris/sv/ssd/START/BE/BE0101/BE0101G/BefUtvKon1749"
json = {
"query": [
{
"code": "Kon",
"selection": {
"filter": "item",
"values": [
"1",
"2"
]
}
},
{
"code": "ContentsCode",
"selection": {
"filter": "item",
"values": [
"000000LV"
]
}
}
],
"response": {
"format": "px"
}
}
r = requests.post(url=url, json=json)
Ниже приведен код Julia, который не работает, с этим сообщением об ошибке:
синтаксис: { } векторный синтаксис прекращен вокруг
области верхнего уровня path:8 в population_data.jl:8
using DataFrames, DataFramesMeta, HTTP, JSON3
url = "http://api.scb.se/OV0104/v1/doris/sv/ssd/START/BE/BE0101/BE0101G/BefUtvKon1749"
json = {
"query": [
{
"code": "Kon",
"selection": {
"filter": "item",
"values": [
"1",
"2",
"1 2"
]
}
},
{
"code": "ContentsCode",
"selection": {
"filter": "item",
"values": [
"000000LV"
]
}
}
],
"response": {
"format": "px"
}
}
r = HTTP.post(url, json)
Мои попытки решить эту проблему заключаются в следующем:
- Преобразуйте переменную json в строку, используя «»» вокруг нее.
- Преобразование строки JSON в типы данных Julia с использованием JSON3.read()
- Передача преобразованной строки JSON в POST-запрос. Это выдает следующую ошибку:
IOError(Base.IOError("read: connection reset by peer (ECONNRESET)", -54) during request(http://api.scb.se/OV0104/v1/doris/sv/ssd/START/BE/BE0101/BE0101G/BefUtvKon1749)
Ничего из этого не работает, и я даже не уверен, что речь идет о формате JSON. Возможно, я передаю неправильные параметры в POST-запрос. Что мне делать?
Ответ №1:
Один из способов решения этой проблемы заключается в создании параметров как собственных структур данных Julia и использовании JSON
их для преобразования и использования в качестве тела вашего запроса PUT:
Словари в julia создаются с использованием синтаксиса, подобного Dict(key => value)
. Массивы создаются с использованием стандартного синтаксиса: [a, b, c]
. Собственная структура данных Julia, эквивалентная вашим параметрам, будет выглядеть следующим образом:
params = Dict(
"query" => [
Dict("code" => "Kon",
"selection" => Dict(
"filter" => "item",
"values" => [
"1",
"2",
"1 2"
]),
),
Dict("code"=> "ContentsCode",
"selection" => Dict(
"filter" => "item",
"values" => [
"000000LV"
]),
),
],
"response" => Dict(
"format" => "px"
))
Затем вы можете использовать JSON.json()
для создания JSON-представления его в виде строки и передать его в HTTP-запрос:
using HTTP
using JSON
url = "http://api.scb.se/OV0104/v1/doris/sv/ssd/START/BE/BE0101/BE0101G/BefUtvKon1749"
# send the request
r = HTTP.request("POST", url,
["Content-Type" => "application/json"],
JSON.json(params))
# retrieve the response body as a string
b = String(r.body)