oyomad Skrevet 27. mai 2013 Del Skrevet 27. mai 2013 Hallo! Trenger litt hjelp til å få tilgang til data via REST-api. Jeg må vist sende en GET-request, men jeg har ingen aning på hvordan dette gjøres. Lurer derfor på om noen kan vise meg hvordan dette gjøres, både i form av relevant kode og i hvilket program dette skal gjøres Link til API her: https://www.vegvesen.no/nvdb/api/ MVH Øystein. Lenke til kommentar
etse Skrevet 27. mai 2013 Del Skrevet 27. mai 2013 GET request kan gjøres på mange måter, men standard måten er bare å åpne det opp i en browser, som gjør en GET-request per default. Skal du gjøre dette i programmering har de fleste språk et HTTP-bibliotek som støtter å gjøre getrequester bare du gir det en URL. I tillegg kan du enkelt gjøre det ved å bare åpne en socket og sende riktig data og så lese svaret du får. Vanligvis følger slike tjenester HTTP-protokollen. Du kan se hva du skal sende her: http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Example_session "Client request" er dataen du sender i det eksempelet. Lenke til kommentar
alexanderh89 Skrevet 27. mai 2013 Del Skrevet 27. mai 2013 (endret) Her har du en veldig enkel kodesnutt i python med requests-biblioteket. Kort fortalt: Vi sender en GET-request til vegvesenets api der vi sier at vi aksepterer deres mediaformat. Vi mottar så data fra apiet i dette formatet, da enten i xml eller json. #!/usr/bin/python import requests req = requests.get('https://www.vegvesen.no/nvdb/api/', verify=False, headers={'ACCEPT':'application/vnd.vegvesen.nvdb-v1+json'}) print req.status_code print req.text Denne kodesnutten gir meg dette resultatet: $ python nvdb.py 200 {"ressurser":[{"rel":"definisjoner","uri":"/datakatalog"},{"rel":"vegobjekter","uri":"/vegobjekter"},{"rel":"sokegrensesnitt","uri":"/sok"},{"rel":"vegreferanse","uri":"/vegreferanse"}]} Endret 27. mai 2013 av alexanderh89 Lenke til kommentar
GeirGrusom Skrevet 28. mai 2013 Del Skrevet 28. mai 2013 (endret) For de aller fleste programmeringsspråk finnes det API-er for å gjøre om et JSON eller XML-svar til et objekt, som gjør det litt enklere å jobbe med. http://docs.python.org/2/library/json.html De fleste foretrekker JSON for tiden, men jeg har enda ikke vært borti et API som ikke bruker enten JSON eller XML. Endret 28. mai 2013 av GeirGrusom Lenke til kommentar
alexanderh89 Skrevet 28. mai 2013 Del Skrevet 28. mai 2013 (endret) Og slik kan få en dict av XML-responsen fra nvdb: #!/usr/bin/python # -*- coding: utf-8 -*- import requests import xml.etree.cElementTree as et def nvdb(): req = requests.get('https://www.vegvesen.no/nvdb/api/datakatalog/', verify=False, headers={'ACCEPT':'application/vnd.vegvesen.nvdb-v1+xml'}) r = (req.text) out = (et.fromstring(r)) return out for i in nvdb().iter('ressurs'): if i.attrib: out = { 'uri': i.attrib['uri'], 'rel': i.attrib['rel'] } print(out) Det finnes nok enklere og bedre måter å gjøre det på, men dette er kun et eksempel. Slik ser det ut: $ python client.py {'uri': '/datakatalog/objekttyper', 'rel': 'vegobjekt-typer'} {'uri': '/datakatalog/objekttyper/{vegobjekt-type-id}', 'rel': 'vegobjekt-type-definisjon'} {'uri': '/datakatalog/egenskapstype/{egenskaps-id}', 'rel': 'egenskaps-type-definisjon'} Endret 28. mai 2013 av alexanderh89 Lenke til kommentar
GeirGrusom Skrevet 28. mai 2013 Del Skrevet 28. mai 2013 (endret) Litt mindre enkel kodesnutt i C#. Jeg skrev noen hjelpefunksjoner for deg som gjør at du kan legge inn argumenter i URL-en ved å bruke .NET typer, samt både statisk og dynamiske varianter av Request. [size=4]using System;[/size] using System.IO; using System.Linq; namespace WebRequst { class Program { static Uri CreateUrl(string baseUrl, params object[] arguments) { if (string.IsNullOrEmpty(baseUrl)) throw new ArgumentNullException("baseUrl"); return arguments != null ? new Uri(string.Concat( baseUrl.EndsWith("/") ? baseUrl : baseUrl + '/', string.Join("/", arguments.Select(t => System.Web.HttpUtility.UrlEncode(t.ToString()))))) : new Uri(baseUrl); } static string RequestString(string baseUrl, params object[] arguments) { var request = System.Net.WebRequest.CreateHttp(CreateUrl(baseUrl, arguments)); request.Accept = "application/vnd.vegvesen.nvdb-v1+json"; var resStream = request.GetResponse().GetResponseStream(); if (resStream == null) return null; using (var rd = new StreamReader(resStream)) return rd.ReadToEnd(); } static object Request(string baseUrl, params object[] arguments) { string s = RequestString(baseUrl, arguments); if (s == null) return null; return Newtonsoft.Json.JsonConvert.DeserializeObject(s); } static TResult Request<TResult>(string baseUrl, params object[] arguments) { string s = RequestString(baseUrl, arguments); if (s == null) return default(TResult); return Newtonsoft.Json.JsonConvert.DeserializeObject<TResult>(s); } static void Main() { const string url = "https://www.vegvesen.no/nvdb/api/"; dynamic result = Request(url, "datakatalog"); foreach (var item in result.ressurser) Console.WriteLine(string.Format("{0} finnes i {1}", item.rel, string.Concat(url.TrimEnd('/'), item.uri))); } } } Endret 28. mai 2013 av GeirGrusom 2 Lenke til kommentar
oyomad Skrevet 4. juni 2013 Forfatter Del Skrevet 4. juni 2013 GET request kan gjøres på mange måter, men standard måten er bare å åpne det opp i en browser, som gjør en GET-request per default. Skal du gjøre dette i programmering har de fleste språk et HTTP-bibliotek som støtter å gjøre getrequester bare du gir det en URL. I tillegg kan du enkelt gjøre det ved å bare åpne en socket og sende riktig data og så lese svaret du får. Vanligvis følger slike tjenester HTTP-protokollen. Du kan se hva du skal sende her: http://en.wikipedia....Example_session "Client request" er dataen du sender i det eksempelet. Takk for svar! Lurte på hvordan man gjør dette i en browser. Har prøvd i forskjellige browsere, men kommer bare til google søk når jeg skriver inn requesten. - Øystein Her har du en veldig enkel kodesnutt i python med requests-biblioteket. Kort fortalt: Vi sender en GET-request til vegvesenets api der vi sier at vi aksepterer deres mediaformat. Vi mottar så data fra apiet i dette formatet, da enten i xml eller json. #!/usr/bin/python import requests req = requests.get('https://www.vegvesen.no/nvdb/api/', verify=False, headers={'ACCEPT':'application/vnd.vegvesen.nvdb-v1+json'}) print req.status_code print req.text Denne kodesnutten gir meg dette resultatet: $ python nvdb.py 200 {"ressurser":[{"rel":"definisjoner","uri":"/datakatalog"},{"rel":"vegobjekter","uri":"/vegobjekter"},{"rel":"sokegrensesnitt","uri":"/sok"},{"rel":"vegreferanse","uri":"/vegreferanse"}]} Takk for svar! Ettersom jeg ikke er så kjent med python lurte jeg på hvordan man kjører ett sånn script, trenger jeg f.eks et eget program? Lenke til kommentar
oyomad Skrevet 4. juni 2013 Forfatter Del Skrevet 4. juni 2013 Litt mindre enkel kodesnutt i C#. Jeg skrev noen hjelpefunksjoner for deg som gjør at du kan legge inn argumenter i URL-en ved å bruke .NET typer, samt både statisk og dynamiske varianter av Request. [size=4]using System;[/size] using System.IO; using System.Linq; namespace WebRequst { class Program { static Uri CreateUrl(string baseUrl, params object[] arguments) { if (string.IsNullOrEmpty(baseUrl)) throw new ArgumentNullException("baseUrl"); return arguments != null ? new Uri(string.Concat( baseUrl.EndsWith("/") ? baseUrl : baseUrl + '/', string.Join("/", arguments.Select(t => System.Web.HttpUtility.UrlEncode(t.ToString()))))) : new Uri(baseUrl); } static string RequestString(string baseUrl, params object[] arguments) { var request = System.Net.WebRequest.CreateHttp(CreateUrl(baseUrl, arguments)); request.Accept = "application/vnd.vegvesen.nvdb-v1+json"; var resStream = request.GetResponse().GetResponseStream(); if (resStream == null) return null; using (var rd = new StreamReader(resStream)) return rd.ReadToEnd(); } static object Request(string baseUrl, params object[] arguments) { string s = RequestString(baseUrl, arguments); if (s == null) return null; return Newtonsoft.Json.JsonConvert.DeserializeObject(s); } static TResult Request<TResult>(string baseUrl, params object[] arguments) { string s = RequestString(baseUrl, arguments); if (s == null) return default(TResult); return Newtonsoft.Json.JsonConvert.DeserializeObject<TResult>(s); } static void Main() { const string url = "https://www.vegvesen.no/nvdb/api/"; dynamic result = Request(url, "datakatalog"); foreach (var item in result.ressurser) Console.WriteLine(string.Format("{0} finnes i {1}", item.rel, string.Concat(url.TrimEnd('/'), item.uri))); } } } Tusen takk for svar! Dette er nok en kode langt over min kunnskap innenfor programmering. Men uansett takk for at du tok deg bryet til å skrive den. Hvem vet, kanskje jeg får bruk for den en dag Lenke til kommentar
snippsat Skrevet 4. juni 2013 Del Skrevet 4. juni 2013 (endret) Takk for svar! Ettersom jeg ikke er så kjent med python lurte jeg på hvordan man kjører ett sånn script, trenger jeg f.eks et eget program? Du trenger Python 2.7.5 og Requests. Du trenger nok og sette deg litt inn i programmering eller blir selv de enkeleste oppgaver helt håpløst. GET-request gir tilbake json data. Her en kort demo hvordan ta ut noen verdier fra json data man får tilbake,bruker som nevnt av GeirGrusom json modul som er bygd inn i Python. >>> import json >>> js = json.loads(req.text) >>> js {u'ressurser': [{u'rel': u'definisjoner', u'uri': u'/datakatalog'}, {u'rel': u'vegobjekter', u'uri': u'/vegobjekter'}, {u'rel': u'sokegrensesnitt', u'uri': u'/sok'}, {u'rel': u'vegreferanse', u'uri': u'/vegreferanse'}]} >>> #Ta ut verdi /datakatalog >>> js['ressurser'][0]['uri'] u'/datakatalog' >>> #Ta ut alle verdier rel har >>> [js['ressurser'][i]['rel'] for i,n in enumerate(js['ressurser'])] [u'definisjoner', u'vegobjekter', u'sokegrensesnitt', u'vegreferanse'] >>> js.keys() [u'ressurser'] >>> js['ressurser'][0].keys() [u'uri', u'rel'] >>> js['ressurser'][0].values() [u'/datakatalog', u'definisjoner'] Etter json.loads(req.text) får man en Python "dictionary/list" struktur tilbake. Da bruker man vanlig måte og aksessere "dictionary/list" for og ta ut data. Endret 4. juni 2013 av SNIPPSAT Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå