Till senaste kommentaren
Detta inlägg är gammalt och kan innehålla inaktuell information.

Förslag till trevligare resonsdata Reseplanneraren 2.

Hej!

Skulle vilja föreslå en API standard som är mer anpassad till datan som kommer ut ut SL reseplanneraren 2s API.

Jag använer själv denna: http://access.thure.org/trip.json (Enbart nåbar via IPv6, ett väldigt effektivt sätt att undvika DDoS) som skickar vidare frågan till SL och som sedan fixar resultatet:

  1. Alla "&" stopps in direkt under objektet så att det går att komma åt enkelt i alla språk.
  2. Alla listor är listor även om det bara är en rad i listan så att man altid kan köra en for loop på svaret.
  3. Alla listor är listor direkt och inte objekt med en bara ett barn som är listan.

Skulle gärna vilja att denna lösning fanns tillgänglig via trafiklab så att alla slipper att implementera hanteringa av detta i alla lösningar.

Kommentarer

  • Responsdata skulle det vara.

  • Kan du posta exemplet här? Jag kommer inte åt siten du länkar till.

    Kan du ge exempel på vad det är som åtgärdar DDoS problematiken och vad det är som gör att den finns just nu, samt exempel på punktlistan du skrivit?

  • Du måste använda IPv6 frö att kunna komma åt siten, där av är det svårt att skapa en DDoS attack eftersom det är lätta att byta IP samt att många av botnäten inte har IPv6.

    Kod:
    import tornado.ioloop
    import tornado.web
    import tornado.httpclient
    import json

    class MainHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(self):
    hclient = tornado.httpclient.AsyncHTTPClient()
    hclient.fetch("http://api.sl.se/api2/TravelplannerV2/trip.json?"+self.request.uri.split("?")[1], self.searchdone)

    def searchdone(self, response):
    data = json.loads(response.body)
    if type(data["TripList"]["Trip"]) == list:
    utdata = {"TripList":data["TripList"]["Trip"]}
    else:
    utdata = {"TripList":[data["TripList"]["Trip"]]}
    for trip in range(len(utdata["TripList"])):
    try:
    utdata["TripList"][trip]["PriceInfo"]["TariffMessages"] = utdata["TripList"][trip]["PriceInfo"]["TariffMessages"]["TariffMessage"]["$"]
    except:
    utdata["TripList"][trip]["PriceInfo"]["TariffMessages"] = ""

    try:
    utdata["TripList"][trip]["PriceInfo"]["TariffZones"] = utdata["TripList"][trip]["PriceInfo"]["TariffZones"]["$"]
    except:
    utdata["TripList"][trip]["PriceInfo"]["TariffZones"] = ""

    try:
    utdata["TripList"][trip]["PriceInfo"]["TariffRemark"] = utdata["TripList"][trip]["PriceInfo"]["TariffRemark"]["$"]
    except:
    utdata["TripList"][trip]["PriceInfo"]["TariffRemark"] = ""

    if type(utdata["TripList"][trip]["LegList"]["Leg"]) == list:
    utdata["TripList"][trip]["LegList"] = utdata["TripList"][trip]["LegList"]["Leg"]
    else:
    utdata["TripList"][trip]["LegList"] = [utdata["TripList"][trip]["LegList"]["Leg"]]
    self.write(utdata)
    self.finish()

    application = tornado.web.Application([
    (r"/trip.json", MainHandler),
    ])

    if name == "main":
    application.listen(80)
    tornado.ioloop.IOLoop.instance().start()

    Exempel på JSON svar från servern ovan:
    {
    "TripList": [
    {
    "dur": "69",
    "co2": "0.48",
    "LegList": [
    {
    "Origin": {
    "name": "M\u00e4rsta",
    "routeIdx": "0",
    "lon": "17.860909",
    "date": "2014-11-10",
    "time": "13:36",
    "lat": "59.623462",
    "type": "ST",
    "id": "400105125"
    },
    "name": "pendelt\u00e5g 36",
    "idx": "3",
    "Destination": {
    "name": "Stockholms central",
    "routeIdx": "11",
    "lon": "18.057764",
    "date": "2014-11-10",
    "time": "14:14",
    "lat": "59.329344",
    "type": "ST",
    "id": "400105013"
    },
    "GeometryRef": {
    "ref": "ref=806097%2F2"
    },
    "JourneyDetailRef": {
    "ref": "ref=806097%2F"
    },
    "line": "36",
    "type": "TRAIN",
    "dir": "S\u00f6dert\u00e4lje C"
    }
    ],
    "PriceInfo": {
    "TariffZones": "ABC",
    "TariffMessages": "",
    "TariffRemark": "4 biljett"
    },
    "chg": "1"
    }
    ]
    }

    Svar från SL med samma fråga:
    {
    "TripList":{
    "noNamespaceSchemaLocation":"hafasRestTrip.xsd",
    "Trip":{
    "dur":"69",
    "chg":"1",
    "co2":"0.48",
    "LegList":{
    "Leg":[
    {
    "idx":"3",
    "name":"pendeltåg 36",
    "type":"TRAIN",
    "dir":"Södertälje C",
    "line":"36",
    "Origin":{
    "name":"Märsta",
    "type":"ST",
    "id":"400105125",
    "lon":"17.860909",
    "lat":"59.623462",
    "routeIdx":"0",
    "time":"13:36",
    "date":"2014-11-10"
    },
    "Destination":{
    "name":"Stockholms central",
    "type":"ST",
    "id":"400105013",
    "lon":"18.057764",
    "lat":"59.329344",
    "routeIdx":"11",
    "time":"14:14",
    "date":"2014-11-10"
    },
    "JourneyDetailRef":{
    "ref":"ref=460731%"
    },
    "GeometryRef":{
    "ref":"ref=460731%2F1616"
    }
    }]
    },
    "PriceInfo":{
    "TariffZones":{
    "$":"ABC"
    },
    "TariffRemark":{
    "$":"4 biljett"
    }
    }
    }
    }
    }

  • Ok, tror att jag förstår vad du syftar till då.

    Gällande:

    1. Alla "&" stopps in direkt under objektet så att det går att komma åt enkelt i alla språk.

    Jag har förut föreslagit en struktur som denna i xml:
    <GeometryRef type="WALK" startx="17883715" starty="59347745" endx="17892830" endy="59345902" dt="2014-09-11T19:27" h="fas" />

    Vilket är i stil med det du föreslår om jag förstår det rätt. Men limiteringar har gjort att det är en url som skickas med. Vad jag vet så kommer det inte att bli ändrat.

    1. Alla listor är listor även om det bara är en rad i listan så att man alltid kan köra en for loop på svaret.

    Ett annat inlägg här: http://kundo.se/org/trafiklabse/d/reseplanerare...
    Inlägget beskriver det felet. Vi håller på och kollar på detta.

    1. Alla listor är listor direkt och inte objekt med en bara ett barn som är listan.

    TripList innehåller två fält, 1 för .xsd och 1 för Trip som är en lista. Det ser ut att vara korrekt förfarande för mig. LegList innehåller just nu bara Leg såsom du beskriver, men det är nog inte skrivet i sten att det alltid kommer vara så. Så för att framtidssäkra så är det bättre att ha det som det är nu anser jag.
    Skulle man vilja lägga till ett fält till i t.ex. LegList så skulle ditt exempel sluta fungera, medens i det befintliga så skulle det bara bli ytterligare ett fält som man ännu inte implementerat.

    1. DDoS.

    Gällande IPv6 som skydd. Det går nog inte att förutsätta att botnätverk inte klarar av att anpassa sig..

  • Ser nu att det blev en väldigt otydlig separering mellan frågan och svaret i min lista..

  • Hej!

    Med tiden kommer botnäten att ha IPv6 men det kommer att ta tid och i det mellanrummet så kan man slappna av.

    Ur ett XML perspektiv så är det logiskt men ur ett JSON perspektiv så är det inte det. Generellt om ett objekts namn har med typen i sitt namn så bör typen stämma med innehållet. TripsData borde den heta annars men TripList bör ju vara en lista. I xml är ju exempelvis LegList en lista med Leg object men i Json blir LegList ett object med en lista som heter Leg. Det är bättre att listan heter LegList, mycket tydligare? Sedan kan jag hålla med om att det skulle kunna vara en objektnivå till tex: SearchResponse eller kanske TripsData som innehåller diverse framtida sökningsspecifika data samt TripList.

Kommentera eller skriv ett nytt inlägg

Ditt namn och inlägg kan ses av alla. Din e-post visas aldrig publikt.