Python script omzetten naar PHP

Pagina: 1
Acties:

Vraag


  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Beste allemaal,

Helaas heb ik (nog) geen kennis van Phyton.
Wel kreeg ik van iemand een *.py script toegestuurd met daarin een aantal voorbeelden.
Dit zijn voorbeelden om een webservice te benaderen.
Deze webservice zou ik graag zelf met PHP (eventueel met behulp van cURL) willen raadplegen.

Wie 'o wie kan me helpen met het "vertalen" naar PHP?

Dit is (een stuk van) het script wat ik als *.py bestand heb gekregen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
headers = {'api_key': '123abc123'}

proxies = {"http": None, "https": None}

host = "https://webservice.com/v2"

period_specification = {
    "from_time": "2016-07-21",
    "to_time": "2016-07-22"
}

r = requests.get(host + '/report/new',json=period_specification, headers=headers, proxies=proxies)
print(r.content)


Ik begrijp dat ik dus een GET request moet doen naar die host, en dat ik enkele "variabelen" (de headers zoals bijvoorbeeld api_key) moet meegeven in het request. Maar hoe geeft ik die nu precies door met iets in PHP? En hoe kan ik period_specification doorgeven in mijn request? Die valt in het voorbeeld buiten de headers, dus zal dat ergens anders moeten worden doorgegeven, maar ik kan niet vinden waar precies.

In (PHP) cURL heb ik bijvoorbeeld het volgende geprobeerd, maar helaas zonder werkend resultaat:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$curl_h = curl_init($url);

curl_setopt($curl_h, CURLOPT_HTTPHEADER,
    array(
        'api_key: 123abc123',
        'from_time: 2016-09-21',
        'to_time: 2016-09-22',
    )
);

curl_setopt($curl_h, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($curl_h);
echo $response;


Wat doe ik fout? Zo moeilijk zal een GET request toch niet zijn dacht ik :-(

Alle reacties


Acties:
  • +1 Henk 'm!

  • mirglep
  • Registratie: Oktober 2014
  • Laatst online: 08-04-2022
Zo te zien worden de `from_time` en `to_time` als json meegegeven in de request params (en dus niet als headers). Je zal deze zelf dus ook als json moeten encoden en als params moeten meegeven voor de webservice.

Ik zou zelf beginnen bij de documentatie van de API om te kijken hoe ze het willen hebben, maar als je het wilt reverse engineeren vanuit de python code kan je deze pagina raadplegen:

http://docs.python-reques...uickstart/#make-a-request

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
mirglep schreef op woensdag 28 september 2016 @ 16:05:
Zo te zien worden de `from_time` en `to_time` als json meegegeven in de request params (en dus niet als headers). Je zal deze zelf dus ook als json moeten encoden en als params moeten meegeven voor de webservice.

Ik zou zelf beginnen bij de documentatie van de API om te kijken hoe ze het willen hebben, maar als je het wilt reverse engineeren vanuit de python code kan je deze pagina raadplegen:

http://docs.python-reques...uickstart/#make-a-request
Thanks voor de snelle reactie!

Ik heb helaas geen documentatie of wat dan ook, dat het zal vooral op "reverse engineering" moeten.

Dus als ik het goed begrijp is "json" ook een soort van "parameter" wat je net als headers kunt meegeven in een GET reguest?! Maar waar kan/moet ik dat dan doen? Of bedoel je als params meegeven dat ik ze achter de URL moet ingeven als bijvoorbeeld ?from_time=2016-07-21&to_time=2016-07-22 ?

Komt er dus op neer dat ik alleen api_key moet meegeven als header, en de rest via de URL van de aanroep? Klopt dat?

Acties:
  • +1 Henk 'm!

  • MeZZiN
  • Registratie: Augustus 2002
  • Laatst online: 16-07 14:24
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
range['from_time'] = '2016-09-21';
range['to_time'] ='2016-09-22';

$baseUrl = "https://webservice.com/v2";

$curl_h = curl_init($baseUrl +"?json=" + urlencode(json_encode(range)));


curl_setopt($curl_h, CURLOPT_HTTPHEADER,
    array(
        'api_key: 123abc123'
    )
);

curl_setopt($curl_h, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($curl_h);
echo $response;


Even snel bedacht :) kan een syntax error bevatten heb geen PHP hier alleen maar aan javascript knutselen. Maar je had in de headers de json object gestopt. En dat moet in de get params. Maar het is geen nette api maar goed dat is een andere discussie.

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
MeZZiN schreef op woensdag 28 september 2016 @ 16:27:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
range['from_time'] = '2016-09-21';
range['to_time'] ='2016-09-22';

$baseUrl = "https://webservice.com/v2";

$curl_h = curl_init($baseUrl +"?json=" + urlencode(json_encode(range)));


curl_setopt($curl_h, CURLOPT_HTTPHEADER,
    array(
        'api_key: 123abc123'
    )
);

curl_setopt($curl_h, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($curl_h);
echo $response;


Even snel bedacht :) kan een syntax error bevatten heb geen PHP hier alleen maar aan javascript knutselen. Maar je had in de headers de json object gestopt. En dat moet in de get params. Maar het is geen nette api maar goed dat is een andere discussie.
Thanks, het is me weer een stukje duidelijker geworden :)
Dat "time window" moet dus echt (op de één of andere manier, want het werkt nog niet) in de URL worden meegegeven. Das goed om te weten natuurlijk, dan hoef ik die niet meer in de headers proberen te stoppen :+

Het gaat wel nog fout omtrent die "range", dat pakt'ie op de een of andere manier toch niet...

  • MeZZiN
  • Registratie: Augustus 2002
  • Laatst online: 16-07 14:24
Ik denk dat de hij hem in de data mee stuurt of iets. Kan even het python script niet uitvoeren maar daar lijkt het op het is denk ik niet de json param maar dat hij het als json data opstuurt.

Acties:
  • +1 Henk 'm!

  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

Als je de documentatie van requests erbij pakt zie je:
• json -- (optional) json data to send in the body of the Request.
Het JSON object wordt dus in de body van de GET request gestopt. Alhoewel GET requests volgens de standaard geen body hebben, wordt dit toch veelvuldig gebruikt. Je kunt een body toevoegen via de setopt CURLOPT_POSTFIELDS.

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/


  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Daedalus schreef op woensdag 28 september 2016 @ 18:58:
Als je de documentatie van requests erbij pakt zie je:

[...]
Het JSON object wordt dus in de body van de GET request gestopt. Alhoewel GET requests volgens de standaard geen body hebben, wordt dit toch veelvuldig gebruikt. Je kunt een body toevoegen via de setopt CURLOPT_POSTFIELDS.
Thanks! Weer een stap verder :) Ik wist niet dat je ook een body kon meesturen met een GET.

Hoe giet ik die

code:
1
2
3
4
period_specification = {
    "from_time": "2016-07-21",
    "to_time": "2016-07-22"
}



vervolgens in een mooi jasje voor in die body? Ik neem aan dat ik ergens dat "period_specification" ook moet neerzetten, maar in wat voor vorm?


[edit]

En dat proxies = {"http": None, "https": None} moet volgens mij ook nog ergens in, maar dat snap ik dus ook niet...
Dan kan toch niet allemaal in headers, of nu dan body? Anders zou het in het originele PY script toch ook samen staan?

[edit2]

Oh, het werkt gewoon zonder dat proxies verhaal.
Ik geef dat time-gedoe in de body door, en de rest in de header. Dan werkt het :)
Cool! thanks allemaal 8)

[ Voor 20% gewijzigd door Atmoz op 28-09-2016 19:43 ]


Acties:
  • +1 Henk 'm!

  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

Ben niet zo bekend met PHP, maar JSON is gewoon een string met een bepaald formaat. Gok dat je die period_specification als string als parameter aan curl_setopt kunt meegeven. Beter is uiteraard om netjes met PHP objecten/arrays te werken en met een encoder deze naar JSON te laten omzetten, in plaats van zelf strings in elkaar gaan zitten knutselen. Zo te zien heeft PHP daar ook json_encode en json_decode functies voor.

Voor wat betreft de proxies: dat zal iets zijn wat je in cURL moet configuren. Aangezien ze allebei op 'None' staan kun je ze waarschijnlijk negeren. Maar anders pak je documentatie van cURL erbij om te kijken hoe je dit kunt doorgeven.

[edit]
En blijkbaar werkt dat :P

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/

Pagina: 1