[RESOLU] php curl pour vrp solver

Wolfy
Invité n'ayant pas de compte PHPfrance

12 juin 2018, 09:43

Bonjour je viens vers vous pour un problème épineux pour moi.

J'ai accès à une API solver, sensé optimiser le parcours de mes camions, mais je n'arrive pas à la mettre en pratique.

La documentation est fournie en anglais (et je ne parle pas anglais et les traduction automatique ne sont pas top), cette documentation est faite pour shell, mais le support me dit qu'effectivement il est possible de le faire en php mais n'ont pas de source d'exemple

https://www.solvice.io/docs/vrp/#introduction

J'arrive à me connecté, mais pas à envoyer mes tâche et initialiser l'optimalisation de parcours.

Voilà ou j'en suis :

Code : Tout sélectionner

/** * url requête : https://api.solvice.io/v1/solve **/ /** Boucle sur les véhicules * fleet [ * { * name : String Nom unique du véhicule (Obligatoire) * startLocation : String Nom de la localisation de départ (Obligatoire) * endLocation : String Nom de la localisation de fin (Facultative) * } * ] **/ $fleet = array( array('name' => "truck1", 'startLocation' => "startend", 'endLocation' => "startend"), ); /** boucle structurée comme ceci : * locations [ * { * name : Nom unique de la localisation * latitude : Latitude * longitude : Longitude * } * ] **/ $locs = array( array( 'name' => "startend", 'latitude' => "50.4723", 'longitude' => "4.83258" ), // Départ et arrivée array( 'name' => "tache1", 'latitude' => "50.3766", 'longitude' => "4.89706" ), // Tâche 1 array( 'name' => "tache2", 'latitude' => "50.3755", 'longitude' => "4.86095" ), // Tâche 2 array( 'name' => "tache3", 'latitude' => "50.3719", 'longitude' => "4.87840" ), // Tâche 3 array( 'name' => "tache4", 'latitude' => "50.3875", 'longitude' => "4.90065" ), // Tâche 4 array( 'name' => "tache5", 'latitude' => "50.3783", 'longitude' => "4.87253" ), // Tâche 5 array( 'name' => "tache6", 'latitude' => "50.3811", 'longitude' => "4.90994" ), // Tâche 6 array( 'name' => "tache7", 'latitude' => "50.3779", 'longitude' => "4.86896" ), // Tâche 7 array( 'name' => "tache8", 'latitude' => "50.3769", 'longitude' => "4.90505" ), // Tâche 8 ); $jsfleet = json_encode($fleet); $jstache = json_encode($locs); $posts = array(); $posts['locations'] = $jstache; $posts['fleet'] = $jsfleet; $header = array( 'Content-Type: application/json', 'Authorization Basic: demo:demo' ); //$ch = curl_init("https://demo:demo@api.solvice.io/demo/vrp"); $ch = curl_init("https://demo:demo@api.solvice.io/v1/solve"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $posts); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); $response = curl_exec($ch); curl_close ($ch); echo '<pre>'; print_r($response); echo '</pre>';
Et voici le retour

Code : Tout sélectionner

{ "errors" : [ { "errorCode" : "json.duplicate.property", "explanation" : "Unexpected character ('-' (code 45)) in numeric value: expected digit (0-9) to follow minus sign, for valid numeric value", "line" : 1, "column" : 3 } ] }
Le support ne peut pas m'aider malheureusement, c'est pourquoi je viens vers vous, la réponse du support à mon problème est la suivante :
Bonjour,

Je pense que vous avez oublier les ordres. “orders”
Example: https://api.solvice.io/demo/vrp

Et aussi le property: “solver”: “VRP”
Sauf que je ne comprends rien à leur docs et qu'il n'y à pas d'exemple.

En vous remerciant d'avance pour votre participation
Wolfy

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 7697 Messages

12 juin 2018, 09:49

Bonjour,

Ma préconisation serait d'abord que tu utilises Postman (c'est un outil gratuit) pour tester l'API et réussir à faire ce que tu veux.
https://www.getpostman.com
Une fois que tu as les bonnes commandes, tu peux demander à Postman de te faire un export PHP et il va te générer le code qui va bien (que tu pourras remodifier, améliorer ensuite bien sûr, mais au moins ça te fait une base fonctionnel)

L'avantage d'utiliser Postman c'est que ça évite tout risque de bug côté PHP, tu dialogues en direct avec l'API
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 7697 Messages

12 juin 2018, 09:52

Il y a une lib PHP pour Solvice, je ne sais pas si elle fonctionne par contre : https://github.com/skmedia/solvice-client
Quand tout le reste a échoué, lisez le mode d'emploi...

Wolfy
Invité n'ayant pas de compte PHPfrance

12 juin 2018, 11:11

Il y a une lib PHP pour Solvice, je ne sais pas si elle fonctionne par contre : https://github.com/skmedia/solvice-client
j'avais en effet vue cette lib, mais jamais réussi à la faire fonctionné
Ma préconisation serait d'abord que tu utilises Postman (c'est un outil gratuit) pour tester l'API et réussir à faire ce que tu veux.
https://www.getpostman.com
A l'air d'être un outil très sympa, faut juste que je puisse le prendre en main, pas évident quand on ne comprend l'anglais lol ;)
Je vais me pencher la dessus, mais si quelqu'un à un exemple je suis preneur, je vais voir si il y'a pas un tuto ou autre pour postman.

Wolfy
Invité n'ayant pas de compte PHPfrance

12 juin 2018, 11:16

En revanche avec postman sur une requête POST j'ai toujours un 400 bad request

wolfy
Invité n'ayant pas de compte PHPfrance

12 juin 2018, 11:18

Ma requête final est la suivante, je sais pas si je l'ai bien structurée
https://demo:demo@api.solvice.io/v1/sol ... citySpread: true,overconstrained: false,allow_overtime: false}&solver=VRP&locations=[{name:startend,latitude:50.4723,longitude:4.83258},{name:loc1,latitude:50.3766,longitude:4.89706},{name:loc2,latitude:50.3755,longitude:4.86095},{name:loc3,latitude50.3719,longitude:4.87840}]&fleet=[{name:truck1,startlocation:startend,endlocation:startend}]

Petit nouveau ! | 1 Messages

12 juin 2018, 15:27

Bonjour,

Problème résolu, après moult tentative mais on y est houraaaa ;)
Merci pour vos piste qui même si elle n'ont pas servit directement m'ont conduite à la solution

Encore merci, et une bonne fin de journée
Wolfy