Gå til innhold

Hjelp til å få tilgang til data via GET request.


Anbefalte innlegg

Videoannonse
Annonse

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

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 av alexanderh89
Lenke til kommentar

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 av alexanderh89
Lenke til kommentar

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 av GeirGrusom
  • Liker 2
Lenke til kommentar

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

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
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 av SNIPPSAT
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...