[PHP]Van CURL naar PHP

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reb87
  • Registratie: Maart 2003
  • Niet online
Ik ben op dit moment bezig met het uitproberen van een nieuwe API voor Asana (een soort projectmanagement tool). Hiervoor wil ik een simpele data entry form bouwen. De API leunt zwaar op CURL, wat opzich prima is. Ik heb echter helemaal geen ervaring met CURL in combinatie met PHP. De CURL query's werken prima, maar het lukt me maar niet om ze in PHP te krijgen. De gemakkelijke optie (gewoon via een cmd exec) werkt niet ivm server configuratie. :'(

Zelf heb ik de handleiding van CURL op de PHP site doorgenomen, maar daar wordt ik niet wijs uit. De voorbeelden van internet kan ik ook niet veel mee, omdat deze niet dmv een API key (in dit geval een username in HTTPS) werken. Zou iemand mij misschien de goede richting op kunnen wijzen?

code:
1
2
3
4
5
6
curl -u <APIKEY>: https://app.asana.com/api/1.0/tasks \
    -d "assignee=000000" \
    -d "followers[0]=000000" \
    -d "name=Test follower" \
    -d "notes=How are you today%3F"
    -d "workspace=000000"

Acties:
  • 0 Henk 'm!

  • Solopher
  • Registratie: December 2002
  • Laatst online: 11-09 14:55
Met deze pagina:
http://curl.haxx.se/docs/manpage.html

Kun je al heel erg veel:
Ik kan deze code hier niet testen, maar ik denk dat je hier wel wat mee kunt:
Als je events kijkt:
-d = data
-u = username

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$data = array(
    'assignee'  => 000000,
    'followers[0]'   => 000000,
    'name' => 'Test follower',
    'notes' => 'How are you today?',
    'workspace' => 000000
);


$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_POST, true); // set POST to true
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // the data to be POST'ed
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, '<APIKEY>');

$info = curl_getinfo($ch);
$returndata = curl_exec ($ch);
curl_close($ch);


Succes!

Acties:
  • 0 Henk 'm!

  • Wiethoofd
  • Registratie: Juli 2007
  • Laatst online: 14-08 12:22

Wiethoofd

Broadcast TOM

Met je -d wil je data submitten, met PHP doe je dat met de curl_setopt CURLOPT_POSTFIELDS waarin je je huidige data als array neerzet (of als string: field1=value&field2=value2), de -u zou je dan met CURLOPT_USERPWD in kunnen stellen.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$data = array('assignee'     => '000000',
              'followers[0]' => '000000',
              'workspace'   => '000000',
              'name'         => 'Test follower',
              'notes'       => 'How are you today?');

$ch = curl_init('https://app.asana.com/api/1.0/tasks');
$options = array(CURLOPT_USERPWD        => '<APIKEY>:',
                 CURLOPT_HEADER      => false,
                 CURLOPT_POST          => true,
                 CURLOPT_POSTFIELDS  => $data,
                 CURLOPT_RETURNTRANSFER => true);

curl_setopt_array($ch, $options);
$result = curl_exec($ch);
curl_close($ch);

Volg me op Twitter/X & Bluesky


Acties:
  • 0 Henk 'm!

  • Reb87
  • Registratie: Maart 2003
  • Niet online
Hier ben ik al iets verder mee. Ik krijg nu geen errors meer. ;) Echter gebeurt er uiteindelijk nu ook niets. Er komt geen data in Asana te staan.

Acties:
  • 0 Henk 'm!

  • Wiethoofd
  • Registratie: Juli 2007
  • Laatst online: 14-08 12:22

Wiethoofd

Broadcast TOM

Zet eens CURLOPT_HEADER op true en print_r of echo je $result/$returndata en kijk of je foutcodes terugkrijgt.

Let ook op de formatting van de USERPWD, die moet als username:password, is password leeg, dan moet de dubbele punt er nog wel staan.

Volg me op Twitter/X & Bluesky


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 13-09 07:59
Reb87 schreef op donderdag 19 april 2012 @ 15:07:
Hier ben ik al iets verder mee. Ik krijg nu geen errors meer. ;) Echter gebeurt er uiteindelijk nu ook niets. Er komt geen data in Asana te staan.
Verwacht je dat wij een account bij Asana aanmaken om zo voor jou te gaan debuggen? Zie ook: Programming FAQ - Algemeen. Zonder foutmelding kunnen wij ook niets beginnen.

Acties:
  • 0 Henk 'm!

  • Reb87
  • Registratie: Maart 2003
  • Niet online
Ah, ik zie het denk ik al. Er gaat iets fout in de aanlevering van de data. Ik zal het eens als complete string erin plakken en kijken wat er dan gebeurt. Foutmelding nu:

{"errors":[{"message":"Could not parse request data, invalid JSON"}]}

[ Voor 44% gewijzigd door Reb87 op 19-04-2012 16:51 ]


Acties:
  • 0 Henk 'm!

  • Solopher
  • Registratie: December 2002
  • Laatst online: 11-09 14:55
Ik denk dat je hier wel wat mee kunt:
{"errors":[{"message":"Could not parse request data, invalid JSON"}]}
Zo moeilijk is het toch niet om te lezen?

Acties:
  • 0 Henk 'm!

  • Reb87
  • Registratie: Maart 2003
  • Niet online
Net kwam ik niet zo ver Solopher. Nu ik deze melding heb kan ik verder. Gewoon array naar json converteren. :)

Thanks voor de hulp!

Acties:
  • 0 Henk 'm!

  • Reb87
  • Registratie: Maart 2003
  • Niet online
Daar ben ik weer. Helaas gaat er iets mis met de JSON encoding. Na wat heen en weer gemail met Asana support lijkt het erop dat de url encoding roet in het eten gooit en de JSON formatting in de war schopt. Ik heb een aantal dingen met url encoding/decoding geprobeerd (oa. met UTF8 gedoe), maar dat haalt niets uit. De code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

$data = array('data' => array('assignee' => 1234,
'followers' => array(1234),
'workspace' => 1234,
'name' => 'Vanuit PHP',
'notes' => 'How are you today?'));


$ch = curl_init('https://app.asana.com/api/1.0/tasks');
$options = array(CURLOPT_USERPWD => 
'1234:',
CURLOPT_HEADER => false,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_RETURNTRANSFER => true);

curl_setopt_array($ch, $options);
$result = curl_exec($ch);
curl_close($ch);

echo $result
?>


De error:

{"errors":[{"message":"Invalid field: {\"data\":{\"assignee\":1234,\"followers\":[1234],\"workspace\":1234,\"name\":\"Vanuit PHP\",\"notes\":\"How are you today?\"}}"}]}

Is er een andere manier om de curl opdracht zonder enige vervorming door te geven, zodat de JSON formatting in orde blijft?

Acties:
  • 0 Henk 'm!

  • Wiethoofd
  • Registratie: Juli 2007
  • Laatst online: 14-08 12:22

Wiethoofd

Broadcast TOM

De letterlijke melding (Invalid field) is dat je de data in het verkeerde formaat cq een ongeldig invoerveld aanlevert; volgens mij gooit de nested array in je $data hier roet in het eten, die krijg je namelijk als response in je error weer terug.

Volg me op Twitter/X & Bluesky


Acties:
  • 0 Henk 'm!

  • Reb87
  • Registratie: Maart 2003
  • Niet online
De melding blijft hetzelfde als ik de nested array eruit haal. :'( Als ik de data bekijk voordat hij naar curl gaat lijkt hij in orde:

{"data":{"assignee":1234,"followers":[1234],"workspace":1234,"name":"Vanuit PHP","notes":"How are you today?"}}

Zodra ik de data via curl ingevoerd wordt, komen de slashes tevoorschijn. Dit is volgens mij niet helemaal de bedoeling en heeft te maken met die url encoding.

Acties:
  • 0 Henk 'm!

  • Solopher
  • Registratie: December 2002
  • Laatst online: 11-09 14:55
Hoe bekijk je die data dan?
Doe toevallig een json_encode en vervolgens weer een json_encode? Want dan krijg je namelijk slashes.

Bron: http://stackoverflow.com/...e-adding-unwanted-slashes

Acties:
  • 0 Henk 'm!

  • Zeebonk
  • Registratie: Augustus 2005
  • Laatst online: 30-07 20:50
Je moet eens goed kijken wat CURLOPT_POSTFIELDS precies moet zijn. Het lijkt er op dat je maar wat probeerd. Op dit moment geef je de naar JSON omgezette data zo door aan CURL dat deze de data ziet als de naam van een post field. Dit is ook wat het bericht zegt: invalid post field.

[ Voor 28% gewijzigd door Zeebonk op 24-04-2012 14:21 ]


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 13-09 13:25

Patriot

Fulltime #whatpulsert

Zijn die slashes niet gewoon van Asana? Nouja, maakt niet zo veel uit, ik wil even een stapje terug: Wat bedoel je precies als je zegt dat de melding hetzelfde blijft als je de nested array eruit haalt? Wat heb je precies gedaan daar, beetje lullig als jij het over een andere array hebt dan Wiethoofd.

Acties:
  • 0 Henk 'm!

  • Reb87
  • Registratie: Maart 2003
  • Niet online
PHP:
1
2
3
4
5
$data = array('assignee' => 1234,
'followers' => array(5678),
'workspace' => 1234,
'name' => 'Vanuit PHP',
'notes' => 'How are you today?');


Het vreemde is dat de Asana staff me juist deze code teruggaf als "werkend". Hoewel ze het zelf verder niet getest hadden en mij liever via RoR laten werken... ;)

Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Weet de server ook dat je JSON aan het sturen bent? Anders probeert hij het wellicht in een verkeerd formaat te parsen.

[ Voor 19% gewijzigd door Feanathiel op 24-04-2012 18:33 ]


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Als je écht wil debuggen, as in, wil kijken wat er aan de hand is, dan wil je weten wat het verschil is tussen `curl` uitvoeren via de command line en de PHP-CURL-meuk door alle bytes die over je internet-/LAN-verbinding gaan te analyseren. Dán kun je kijken wat en waar in het proces het fout gaat.

Nu kan ik me echter voorstellen dat je daar geen rechten voor hebt op die server, maar wellicht kun je ff snel een of andere binary server-editie van een bekende Linux-distro downloaden (paar minuutjes werk) en die in een virtual machine (ff de gratisch software `VirtualBox` downloaden ofzo) draaien, zodat je lekker kunt gaan Wiresharken.

En de bijbehorende URL's zoek je zelf maar op, want uit dit topic blijkt nou niet echt veel inzet.


Dat stomme ding accepteert alleen SSL/TLS... :X Ja, dan schiet zo'n packet-sniffer ook niet op 8)7

[ Voor 6% gewijzigd door Osiris op 24-04-2012 18:58 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Feanathiel schreef op dinsdag 24 april 2012 @ 18:32:
Weet de server ook dat je JSON aan het sturen bent? Anders probeert hij het wellicht in een verkeerd formaat te parsen.
Dit, in je eerste voorbeeld in hoe je het met curl zelf moet sturen is de data ook geen json. Waarom je er ineens json van gaat maken is mij een raadsel.

Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Osiris schreef op dinsdag 24 april 2012 @ 18:38:
Dat stomme ding accepteert alleen SSL/TLS... :X Ja, dan schiet zo'n packet-sniffer ook niet op 8)7
Klik hier voor werkend PHP-voorbeeld in deze post helemaal onderaan.

Há, gelukkig ben ik voor geen gat te vangen.. Simpele reverse proxy van Apache fixt 't geheel en levert wat leuke HTTP-dingetjes op:

Request via PHP uit dit topic:
POST /api/1.0/tasks HTTP/1.1
Authorization: Basic <KNIP>
Host: asana.mijn.domeintje.tld.invalid
Accept: */*
Content-Length: 106
Content-Type: application/x-www-form-urlencoded

{"name":"CURL CLI-testje 3","notes":"Bladiebla enzo","workspace":"766777600970","assignee":"766774347026"}


Response:
HTTP/1.1 400 Bad Request
Date: Tue, 24 Apr 2012 17:13:18 GMT
Server: nginx/0.7.67
Cache-control: no-cache="set-cookie"
Content-Type: application/json
X-Asana-Content-String-Length: 51
X-Asana-Preferred-Release-Revision: 20120424_134406_17c953aae206375f9a10c0c6305633e2a5d8211d
Content-Length: 51
Set-Cookie: server=ws_15|T5bfM; path=/
Set-Cookie: <geen idee waar dit voor is, maar knip 't toch maar weg, vast niet nuttig nu>
Connection: close

{"errors":[{"message":"workspace: Missing input"}]}


Request via `curl` via cmd:

POST /api/1.0/tasks HTTP/1.1
Authorization: Basic <KNIP>
User-Agent: curl/7.24.0 (i686-pc-linux-gnu) libcurl/7.24.0 OpenSSL/1.0.0h zlib/1.2.5
Host: asana.mijn.domeintje.tld.invalid
Accept: */*
Content-Length: 88
Content-Type: application/x-www-form-urlencoded

name=CURL CLI-testje 3&notes=Bladiebla enzo&workspace=766777600970&assignee=766774347026


Response:
HTTP/1.1 201 Created
Date: Tue, 24 Apr 2012 17:13:38 GMT
Server: nginx/0.7.67
Cache-control: no-cache="set-cookie"
Content-Type: application/json
Location: /api/1.0/tasks/766970116549
X-Asana-Content-String-Length: 421
X-Asana-Preferred-Release-Revision: 20120424_134406_17c953aae206375f9a10c0c6305633e2a5d8211d
X-Asana-Release-Revision: 20120424_134406_17c953aae206375f9a10c0c6305633e2a5d8211d
Content-Length: 421
Set-Cookie: server=ws_2|T5bfR; path=/
Set-Cookie: <knip>

{"data":{"id":766970116549,"created_at":"2012-04-24T17:13:38.490Z","modified_at":"2012-04-24T17:13:38.490Z","name":"CURL CLI-testje 3","notes":"Bladiebla enzo","completed":false,"assignee_status":"inbox","completed_at":null,"due_on":null,"projects":[],"assignee":{"id":766774347026,"name":"osirisinferi"},"workspace":{"id":766777600970,"name":"OsirisInferi Ltd."},"followers":[{"id":766774347026,"name":"osirisinferi"}]}}


Overigens, als je PHP lekker z'n werk laat doen zonder JSON, dan doet 'ie 't inderdaad niet, omdat 'ie dan wel heel erg suffe shit doet:

Request zonder JSON via CURL in PHP:

POST /api/1.0/tasks HTTP/1.1
Authorization: Basic <knip>
Host: asana.mijn.domeintje.tld.invalid
Accept: */*
Content-Length: 483
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------4a5e7a242d8b

HTTP/1.1 100 Continue

------------------------------4a5e7a242d8b
Content-Disposition: form-data; name="name"

CURL CLI-testje 3
------------------------------4a5e7a242d8b
Content-Disposition: form-data; name="notes"

Bladiebla enzo
------------------------------4a5e7a242d8b
Content-Disposition: form-data; name="workspace"

766777600970
------------------------------4a5e7a242d8b
Content-Disposition: form-data; name="assignee"

766774347026
------------------------------4a5e7a242d8b--


En ja, da's met "CURLOPT_POST" op true, waarbij volgens php.net dan toch écht "application/x-www-form-urlencoded" gebruikt zou moeten worden 8)7

Ah, gevonden waarom. Ligt aan hoe je CURLOPT_POSTFIELDS aanlevert: "If value is an array, the Content-Type header will be set to multipart/form-data."

En bam, gelukt via PHP:

POST /api/1.0/tasks HTTP/1.1
Authorization: Basic <knip>
Host: asana.mijn.domeintje.tld.invalid
Accept: */*
Content-Length: 88
Content-Type: application/x-www-form-urlencoded

name=CURL CLI-testje 3&notes=Bladiebla enzo&workspace=766777600970&assignee=766774347026HTTP/1.1 201 Created
Date: Tue, 24 Apr 2012 17:24:59 GMT
Server: nginx/0.7.67
Cache-control: no-cache="set-cookie"
Content-Type: application/json
Location: /api/1.0/tasks/767036917352
X-Asana-Content-String-Length: 421
X-Asana-Preferred-Release-Revision: 20120424_134406_17c953aae206375f9a10c0c6305633e2a5d8211d
X-Asana-Release-Revision: 20120424_134406_17c953aae206375f9a10c0c6305633e2a5d8211d
Content-Length: 421
Set-Cookie: server=ws_4|T5bh7; path=/
Set-Cookie: <knip>

{"data":{"id":767036917352,"created_at":"2012-04-24T17:24:58.882Z","modified_at":"2012-04-24T17:24:58.882Z","name":"CURL CLI-testje 3","notes":"Bladiebla enzo","completed":false,"assignee_status":"inbox","completed_at":null,"due_on":null,"projects":[],"assignee":{"id":766774347026,"name":"osirisinferi"},"workspace":{"id":766777600970,"name":"OsirisInferi Ltd."},"followers":[{"id":766774347026,"name":"osirisinferi"}]}}


Code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

$key = '<knip>';

$data = 'name=CURL CLI-testje 3&notes=Bladiebla enzo&workspace=766777600970&assignee=766774347026';

$url = 'http://asana.mijn.domeintje.tld.invalid/api/1.0/tasks';

$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_POST, true); // set POST to true 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // the data to be POST'ed 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $key.':');
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

$info = curl_getinfo($ch);
$returndata = curl_exec ($ch);
curl_close($ch);

print_r($returndata);

[ Voor 23% gewijzigd door Osiris op 24-04-2012 19:30 ]


Acties:
  • 0 Henk 'm!

  • Reb87
  • Registratie: Maart 2003
  • Niet online
Osiris, je bent een held! :D

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Dan wil ik jullie beiden deze functie nog als tip geven: http://nl.php.net/manual/en/function.http-build-query.php
Pagina: 1