Как получить доступ к API через Джулию HTTP - PullRequest
0 голосов
/ 10 февраля 2019

Доступ к API Betfair Exchange с помощью Julia

Я использую Julia уже около 2 месяцев, и недавно пытаюсь использовать Julia для доступа к API Betfair.Обратите внимание на эту услугу здесь.https://docs.developer.betfair.com/display/1smk3cen4v3lu3yomq5qye0ni/Getting+Started

Хотя я могу заставить работать пример Python (и у меня есть appKey & sessionToken, хотя он не показан), я не смог успешно перевести этот Python на Julia.

В приведенном ниже примере я получаю ответ StatusError 400 (который является самым близким, который я получил).Другие попытки указывали на связанные проблемы, вероятно, из примера Python с использованием {} и ', который я пытался затем перевести.

Я рассмотрел другие вопросы Stackflow, но обнаружил, что они не имеют сложности, связанной с этим примером..

Интересно, есть ли у кого-нибудь мысли?Заранее спасибо

using HTTP

url="https://api.betfair.com/exchange/betting/json-rpc/v1"
header = "\"X-Application\" : \"appKey\", \"X-Authentication\" : \"sessionToken\" ,\"content-type\" : \"application/json\" "

jsonrpc_req="\"jsonrpc\": \"2.0\", \"method\": \"SportsAPING/v1.0/listEventTypes\", \"params\": {\"filter\":{ }}, \"id\": 1"

response = HTTP.post(url, data=[jsonrpc_req], headers=[header])

println(response.text)

Ожидаемые результаты.В Python я получаю сводку Betfair Sports and Market's.

{"jsonrpc":"2.0","result":[{"eventType":{"id":"1","name":"Soccer"},"marketCount":10668},{"eventType":{"id":"2","name":"Tennis"},"marketCount":4590},{"eventType":{"id":"3","name":"Golf"},"marketCount":43},{"eventType":{"id":"4","name":"Cricket"},"marketCount":394},{"eventType":{"id":"5","name":"Rugby Union"},"marketCount":37},{"eventType":{"id":"1477","name":"Rugby League"},"marketCount":24},{"eventType":{"id":"6","name":"Boxing"},"marketCount":27},{"eventType"
...etc...

В настоящее время получить

HTTP.ExceptionRequest.StatusError(400, HTTP.Messages.Response:
400 Bad Request.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Спасибо Пшемыславу Шуфелю за ваш ответ.После нескольких дней разочарований мне удалось заставить первую часть API работать с использованием образца Excel / VBA здесь: https://github.com/betfair/API-NG-Excel-Toolkit (мои переводы примеров Python не работали).Ваш комментарий помог понять, как структурировать несколько заголовков, и использовать Dict (=>) вместо строки для манипуляций, которые я предпринял выше.

using HTTP
using JSON

const ListEventTypesMethod = "listEventTypes"
const AppKey = "appKey"
const Session = "sessionToken"

function SendRequest(Url, AppKey, Session, Data)
    headers = (("X-Application", AppKey),
                ("content-type", "application/json"),
                ("Accept", "application/json"),
                ("X-Authentication", Session))

  HTTP.get(Url,headers,JSON.json(Data))

end

function ParseJsonRpcResponseToCollection(Response)
    ParseJsonRpcResponseToCollection = JSON.parse(Response)
end

function GetJsonRpcUrl()
    GetJsonRpcUrl = "https://api.betfair.com/exchange/betting/json-rpc/v1/"
end

function MakeJsonRpcRequestString(Method, RequestString)
#MakeJsonRpcRequestString = "{""jsonrpc"": ""2.0"", ""method"": ""SportsAPING/v1.0/" & Method & """, ""params"": " & RequestString & ", ""id"": 1}"
MakeJsonRpcRequestString = Dict("jsonrpc" => "2.0", "method" =>"SportsAPING/v1.0/"*Method, "params" => RequestString, "id"=> 1 )
end

function GetListEventTypesRequestString()
    #GetListEventTypesRequestString = "{""filter"":{}}"
     GetListEventTypesRequestString=Dict("filter" =>Dict())
end


Request = MakeJsonRpcRequestString(ListEventTypesMethod, GetListEventTypesRequestString())
ListEventTypesResponse = SendRequest(GetJsonRpcUrl(), AppKey, Session, Request)

Ответ

HTTP / 1.1 200 OK Дата: вс, 17 фев. 2019 17:28:08 GMT Сервер: Cougar - 4.4.2 (режим Cougar 2) Cache-Control: no-cache Тип содержимого: application / json Зависит: Accept-Кодировка, User-Agent Content-Length: 1850

{"jsonrpc": "2.0", "result": [{"eventType": {"id": "1", "name": "Soccer"}," marketCount ": 6553}, {" типСобытие ": {" ID ":" 2" , "имя": "теннис"}, "marketCount": 5511}, { "типСобытие": { "ID":"3", "name": "Golf"}, "marketCount": 34} и т. Д. *

Надеюсь, это поможет и другим.

0 голосов
/ 10 февраля 2019

Хотя взаимодействие с определенной службой REST является проблемой, относящейся к конкретной проблеме, здесь приведены общие рекомендации.

Во-первых, необходимо правильно отформатировать headers - руководство HTTP.jl гласит: "Заголовки могут быть любой коллекцией, где [string(k) => string(v) for (k,v) in headers] приводит к Vector{Pair}."

Поскольку у нас нет ключа API Betfair, давайте рассмотрим более общий пример с использованием https://postman-echo.com/, который является бесплатным простымТестирование API, которое просто возвращает как JSON все, что получает в качестве входных данных.

using HTTP
using JSON

headers = (("X-Application","appKey"),("X-Authentication","sessionToken"),
           ("content-type","application/json"))

url="https://postman-echo.com/post"

req = Dict("jsonrpc" => "2.0", "params" => Dict("filet" => Dict()))

response = HTTP.post(url, headers, JSON.json(req))
response_text = String(response.body)
json_obj = JSON.parse()

Теперь давайте проанализируем выходные данные из postman-echo.com:

julia> display(JSON.parse(response_text))
Dict{String,Any} with 7 entries:
  "headers" => Dict{String,Any}("x-forwarded-port"=>"443","host"=>"postman-echo.com","x-application"=>"appKey","content-type"…  "json"    => Dict{String,Any}("params"=>Dict{String,Any}("filet"=>Dict{String,Any}()),"jsonrpc"=>"2.0")
  "files"   => Dict{String,Any}()
  "args"    => Dict{String,Any}()
  "data"    => Dict{String,Any}("params"=>Dict{String,Any}("filet"=>Dict{String,Any}()),"jsonrpc"=>"2.0")
  "url"     => "https://postman-echo.com/post"
  "form"    => Dict{String,Any}()

Вы можете легко применить приведенный выше код к любому RESTful JSON API.

...