Einen request als json-Objekt an einen Server schicken

AllesVergessen

Mitglied
Hallo zusammen,

ich versuche gerade einen Request an einen Server zu schicken. Dabei soll der Inhalt als json-Objekt verschlüsselt werden. Da ich mit Beidem in dieser Form noch nie zu tun hatte ist das Ganze nicht einfach für mich - so wie es aussieht kommt im Moment nichts beim Server an. Mein Quellcode dazu sieht so aus:


PHP:
$request_body_send = json_encode($request_body);
$stream = array(
                 'http' => array(
                                  'method' => 'POST',
                                  'header' => "User-Agent: ".$_SERVER['HTTP_USER_AGENT']."\r\n" .
                                                                        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" .
                                                                        "Accept-Charset: UTF-8,ISO-8859-1;q=0.7,*;q=0.7\r\n" .
                                                                        "Cache-Control: no-cache\r\n" .
                                                                        "Cache-Control: no-cache\r\n" .
                                                                        "Accept-language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n" .
                                                                        "DNT: 1\r\n",
                                  'content' => "request_body_send=".$request_body_send,
                                )
                        );
echo file_get_contents('https://my.xxx.com/acp/api/sl/2.1/order/?k=$api_xxx', false, stream_context_create($stream));

Die Serveradresse ist auf jeden Fall korrekt, $request_body gebe ich zur Sicherheit noch aus, da passt alles. Ich denke am ehesten mache ich hier einen Fehler in den Anforderungen des Servers, bei denen ich mir nicht zu 100% sicher bin ob ich sie richtig verstanden habe:

  • The request body must be a JSON object.
  • The request body must be encoded as either UTF8 or plain ASCII. Any other encodings may cause issues.
  • The request content type must be application/json rather than application/x-www-form-urlencoded.
  • It is highly recommended that all URLs passed via the API (i.e. external artwork URLs or callback URLs) are specified as using HTTPS rather than HTTP. This recommendation may be enforced in the future due to browsers becoming much stricter in regards to insecure content. Please see Deprecating Non-Secure HTTP for more information.

Beim letzten Punkt weiß ich, dass das Absenden im Moment auch noch über HTTP geht, daran scheitert es also auch nicht. Erkennt hier jemand vielleicht offensichtliche Fehler? Wie gesagt, ich habe sowas noch nie gemacht, mir etwas zusammengelesen und ein Beispiel aus dem Netz als Vorlage benutzt...

Beste Grüße
Olli
 
Gibt es denn eine Fehlermeldung, also was gibt dir der Server zurück? Irgendwas muss es ja sein, und wenn es ein 404 Not found ist...

Ansonsten würde ich auch mal auf einen HTTP Client umsteigen, der etwas benutzerfreundlicher ist als eine Stream-Ressource selber zu erzeugen (man kann viel falsch machen). Hast du deinen POST request mal gegen irgendeinen (am besten deinen eigenen) Server getestet? Kommt da überhaupt was an, und wenn ja was?

Professionellere Alternative: http://docs.guzzlephp.org/en/latest/
 
Gibt es denn eine Fehlermeldung, also was gibt dir der Server zurück? Irgendwas muss es ja sein, und wenn es ein 404 Not found ist...

Ansonsten würde ich auch mal auf einen HTTP Client umsteigen, der etwas benutzerfreundlicher ist als eine Stream-Ressource selber zu erzeugen (man kann viel falsch machen). Hast du deinen POST request mal gegen irgendeinen (am besten deinen eigenen) Server getestet? Kommt da überhaupt was an, und wenn ja was?

Professionellere Alternative: http://docs.guzzlephp.org/en/latest/

Also erstmal möchte ich fragen ob auch andere Probleme beim Laden dieses threads haben? Bin nun auf der Arbeit, hier kann ich den thread nach ein paar Minuten betrachten, nachdem sich die Werbung geschlossen hat. Zu Hause führt die Werbung zu einem Bluescreen und Absturz meines Windows7-PCs. :(

Dann natürlich vielen Dank für die Antwort. DAS ist ja gerade das Problem: Es gibt keinerlei Fehlermeldungen, aber es kommt auch nichts beim Server an. Diese Zeilen hier enden immer in der Ausgabe von "Läuft nicht":


PHP:
$result = file_get_contents('https://xxx/?k='.$api, false, stream_context_create($stream));
var_dump($stream);
echo "<br>";
error_reporting(E_ALL);
echo "<br>";
if ($result === FALSE)
    { echo "Läuft nicht";}

Die Ausgabe von Stream ergibt Folgendes:


PHP:
array(1) {
  ["http"]=>
  array(3) {
    ["method"]=>
    string(4) "POST"
    ["header"]=>
    string(278) "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0
Accept: application/json;q=0.9,*/*;q=0.8
Accept-Charset: UTF-8;q=0.7,*;q=0.7
Cache-Control: no-cache
Cache-Control: no-cache
Accept-language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
DNT: 1
"
    ["content"]=>
    string(848) "request_body_send={"external_ref":"20141","company_ref_id":"gku2f7s7xkydc8bnfr9iaiif0cx","sale_datetime":"2017-03-07 08:21:34","customer_name":"xxx xxx","customer_email":"xxx@xxx.de","shipping_address_1":"xxx Einkauf","shipping_address_2":"xxx xxxx","shipping_address_3":"xxx","shipping_address_1_additions":"Bitte an der linken T\u00c3\u00bcre bei xxx abgeben!","shipping_country":"Deutschland","shipping_country_code":"DE","billing_address_1":"xxx Einkauf","billing_address_2":"xxx xxx","billing_address_3":"xxx","billing_address_1_additions":"Bitte an der linken T\u00c3\u00bcre bei xxx abgeben!","billing_country":"Deutschland","billing_country_code":"DE","db_artikelanzahl":"1","0":null}"
  }
}

Um auch ganz sicher UTF-8-konform zu sein habe ich auch noch diese Zeilen hinzugefügt:

PHP:
$request_body_utf8 = array_map(utf8_encode, $request_body);
$request_body_send = json_encode($request_body_utf8);

Ich verstehe wirklich nicht, was hier schief geht...
 
Aha, nun scheint die Quelle des Fehlers gefunden zu sein.
Es gibt für den $request_body 2 Arrays die ich über: $request_body = array_merge($request_body, $artikeldetails); zusammenfüge. In der Testausgabe sind die beiden Arrays auch zusammengefügt zu einem Array und werden korrekt ausgegeben, ABER im request in der Variable $request_body_send ist das zweite array $artikeldetails nicht mehr im zusammengefügten array enthalten.

Nach Herausnahme der Zeile $request_body_utf8 = array_map(utf8_encode, $request_body); ist der Artikel nun wieder im $request_body_send enthalten, aber die Fehlermeldung bleibt und es kommt nichts an. :-(
 
Gibt es denn eine Fehlermeldung, also was gibt dir der Server zurück? Irgendwas muss es ja sein, und wenn es ein 404 Not found ist...

Ansonsten würde ich auch mal auf einen HTTP Client umsteigen, der etwas benutzerfreundlicher ist als eine Stream-Ressource selber zu erzeugen (man kann viel falsch machen). Hast du deinen POST request mal gegen irgendeinen (am besten deinen eigenen) Server getestet? Kommt da überhaupt was an, und wenn ja was?

Professionellere Alternative: http://docs.guzzlephp.org/en/latest/

Nach diversen Änderungen, die an meinem Programm vorgenommen werden mussten hänge ich nun wieder bei diesem request-Problem. Nach wie vor scheitert der request, Fehlermeldungen gibt es keine, auch nicht in meiner Konsole.
Um zu prüfen ob und was ankommt würde ich gerne den request an meine eigene Seite schicken von der ich den request auch losschicke und mir das Ergebnis auch gleich ausgeben lassen. Aber wie muss ich das angehen?
 
Du solltest dieses Problem mit CURL lösen können. Zu anpassen sind: $urlCurl und $arrayData

PHP:
$urlCurl = 'https://my.xxx.com/acp/api/sl/2.1/order/?k=$api_xxx';
$arrayData = ['name'=>'inhalt','name'=>'inhalt',['neuerArray'=>'inhalt']];                                                              
$jsonData = json_encode($arrayData);                                                                                
                                                                                                                  
$curl= curl_init($urlCurl);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_POST, TRUE);                                                         
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");                                                                  
curl_setopt($curl, CURLOPT_POSTFIELDS, $jsonData);                                                              
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);                                                                  

                                                                                                   
$ergebnis = curl_exec($curl);
curl_close($curl);

echo $ergebnis;


Um den Request auf deinem Localhost zu testen musst du folgend vorgehen:

Erstelle 2 PHP-Dateien.

1. ersteDatei.php
PHP:
<?php
echo '<pre>';
print_r($_SERVER);
print_r($_POST);
print_r($_GET);
print_r($_FILES);
?>

2. zweiteDatei.php
PHP:
$urlCurl = 'http://localhost:#PORT#/#PFAD#/ersteDatei.php';
$arrayData = ['name'=>'inhalt','name'=>'inhalt',['neuerArray'=>'inhalt']];                                                              
$jsonData = json_encode($arrayData);                                                                                
                                                                                                                   
$curl= curl_init($urlCurl);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_POST, TRUE);                                                      
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");                                                 
curl_setopt($curl, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$ergebnis = curl_exec($curl);
curl_close($curl);

echo $ergebnis;

Bearbeitung durchgeführt..
 
Zuletzt bearbeitet:
Du solltest dieses Problem mit CURL lösen können. Zu anpassen sind: $urlCurl und $arrayData

PHP:
$urlCurl = 'https://my.xxx.com/acp/api/sl/2.1/order/?k=$api_xxx';
$arrayData = ['name'=>'inhalt','name'=>'inhalt',['neuerArray'=>'inhalt']];                                                            
$jsonData = json_encode($arrayData);                                                                              
                                                                                                                
$curl= curl_init($urlCurl);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);                                                          
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");                                                                
curl_setopt($curl, CURLOPT_POSTFIELDS, $jsonData);                                                            
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);                                                                
curl_setopt($curl, CURLOPT_HTTPHEADER,
    ['Content-Type: application/json',                                                                          
    'Content-Length: ' . strlen($jsonData)]
);                                                                                                              
                                                                                                                
$ergebnis = curl_exec($curl);
curl_close($curl);

echo $ergebnis;


Erstmal Danke für die Hilfe.
Nun gibt es wenigstens mal Fehlermeldungen:

{"error":{"message":"Invalid JSON"},"trace":null,"logs":null}

Das war ein Flüchtigkeitsfehler von mir.
Nun erscheint Folgendes mit dem ich nichts anfangen kann:

Code:
{"id":2347998,"ref":"jggdbjmt9f","items":[]}
 
Zuletzt bearbeitet:
Ich hab da nochmal drübergeschaut und eines geändert. Versuche es doch mal erneuert mit dem neuem Code.
 

Neue Beiträge

Zurück