HTTPMessage Objekt verarbeiten
Frank S.
- php
Hallo zusammen,
Ich habe folgendes Problem: ich erhalte von einer Schnittstelle ein HTTPMessage Objekt, das wie folgt aussieht, zurück:
HttpMessage Object
(
[type:protected] => 2
[body:protected] =>
Falsches XML-Format!
[requestMethod:protected] =>
[requestUrl:protected] =>
[responseStatus:protected] => Apple
[responseCode:protected] => 200
[httpVersion:protected] => 1.1
[headers:protected] => Array
(
[Date] => Thu, 23 Sep 2010 17:45:41 GMT
[Server] => Apache/2.2.16 (Unix) mod_ssl/2.2.16 OpenSSL/0.9.8g DAV/2
[Connection] => close
[Content-Length] => 127
[Content-Type] => text/xml; charset=utf-8
)
[parentMessage:protected] =>
)
Ich möchte gerne den Body der Nachricht auslesen, wenn ich jedoch folgende Funktion benutze, erhalte ich nur ein leeres Ergebnis:
echo $message->getBody;
Wie kann ich die einzelnen Bestandteile dieser Nachricht auslesen?
hi,
Ich möchte gerne den Body der Nachricht auslesen, wenn ich jedoch folgende Funktion benutze, erhalte ich nur ein leeres Ergebnis:
echo $message->getBody;
Wenn getBody() sinnvoll arbeiten täte, bräuchte die Methode ein Attribut, was 'body' heißt. Du jedoch hast kein solches Attribut, sondern was Ähnliches 'body:protected'. Schau Dir mal o.g. Method genauer an. Die Namensgebung der Attribute wie 'body:protected' ist außerdem verbesserungswürdig, das sieht mir so aus, als würden da zwei Attribute in einem stecken, das ist nicht sauber aufgedröselt.
Hotti
Die Weltklasse-Definition der Funktion findet man hier:
http://php.net/manual/en/function.httpmessage-getbody.php
Ein Beispiel hingegen finde ich nirgends...
Meine Funktion sieht so aus:
//create the httprequest object
$httpRequest_OBJ = new httpRequest($url, HTTP_METH_POST, $options);
//add the content type
$httpRequest_OBJ->setContentType = 'Content-Type: text/xml';
//add the raw post data
$httpRequest_OBJ->setRawPostData ($xml);
//send the http request
$result = $httpRequest_OBJ->send();
Kann mir bitte mal jemand konkret schreiben, wie ich aus result jetzt den Message-Body auslesen kann? Ich versuch's schon seit 2 Stunden und krieg es einfach nicht hin. Die Dokumentation zu HTTPMessage ist einfach nur beschissen.
Hi!
Meine Funktion sieht so aus:
$httpRequest_OBJ->setContentType = 'Content-Type: text/xml';
Ein Objekt der Klasse HttpRequest hat keine vordefinierte Eitgenschaft setContentType. Mit dieser Anweisung fügst du eine hinzu, was aber keinerlei Wirkung haben wird. Es gibt aber eine Methode mit diesem Namen, die du aufrufen kannst und solltest, wenn du den Content-Type setzen willst. Vermutlich brauchst du dazu aber nur den eigentlichen Content-Type zu übergeben.
$result = $httpRequest_OBJ->send();
Kann mir bitte mal jemand konkret schreiben, wie ich aus result jetzt den Message-Body auslesen kann?
Da das Objekt keine öffentlichen Eigenschaften hat, bleibt dir nur, dessen Methoden zu nutzen. Methoden musst du aber auch wie Methoden und nicht wie Eigenschaften aufrufen. Wenn dir der Unterschied nicht klar ist, solltest du nochmal bei den Grundlagen objektorientierter Programmierung in PHP anfangen.
Lo!
Aha, toll! Bitte möglichst alle Beispiele oder konkrete Hilfestellungen vermeiden. Ist ja erst 20 vor 11 und 3 Stunden lesen deutlich zu wenig für diesen Schwachs!nn. Freue mich schon auf die nächsten 500 möglichst unkonkreten und komplett nutzlosen Antworten.
Hi!
Aha, toll! Bitte möglichst alle Beispiele oder konkrete Hilfestellungen vermeiden. Ist ja erst 20 vor 11 und 3 Stunden lesen deutlich zu wenig für diesen Schwachs!nn. Freue mich schon auf die nächsten 500 möglichst unkonkreten und komplett nutzlosen Antworten.
Der Unterschied zwischen Eigenschaften und Methoden ist absolutes Grundlagenwissen. Dieser Unterschied ist auch zwischen Variablen und Funktionen vorhanden. Wenn eine Funktion oder Methode aufgerufen werden soll, wird nach ihrem Namen immer ein Paar runder Klammern benötigt. Mitunter stehen in den Klammern noch Argumente, die der Funktion übergeben werden sollen. Eigenschaften und Methoden werden in der Hinsicht syntaktisch ebenso behandelt. So sieht's aus: http://www.peterkropff.de/site/php/oop_einfuehrung.htm
Dass im PHP-Handbuch nur eine Auflistung der Mitglieder der HTTP-Klassen zu finden ist, liegt wohl daran, dass das eine PECL-Erweiterung ist, also noch nicht im offiziellen PHP gelandet ist. Trotz der spärlichen Dokumentation sieht man auf beispielsweise auf der Seite zu getBody, dass es sich um eine Methode handelt, einerseits an den Klammern hinter ihrem Namen und daran, dass ein Return Value beschrieben ist. Variablen haben so etwas nicht, sondern nur einen Inhalt.
Lo!
Hi,
Aha, toll! Bitte möglichst alle Beispiele oder konkrete Hilfestellungen vermeiden. Ist ja erst 20 vor 11 und 3 Stunden lesen deutlich zu wenig für diesen Schwachs!nn. Freue mich schon auf die nächsten 500 möglichst unkonkreten und komplett nutzlosen Antworten.
Niemand hier kann etwas dafür, wenn dir das absolute Grundlagenwissen fehlt.
Dafür andere Leute anzukacken, die dich darauf hinweisen, wo deine Fehler liegen, ist reichlich unverschämt.
MfG ChrisB
Hi!
Wenn getBody() sinnvoll arbeiten täte, bräuchte die Methode ein Attribut, was 'body' heißt.
Zwischen beidem gibt es keinen zwingenden Zusammenhang. Es ist lediglich eine Konvention in Sprachen, die das nicht besser können, dass Getter- und Setter-Methoden aus dem Namen von Eigenschaften abgeleitet werden.
Du jedoch hast kein solches Attribut, sondern was Ähnliches 'body:protected'.
Ach?! Was wäre, wenn print_r() bei einem Objekt den Namen der Eigenschaft und dahinter durch Doppelpunkt abgetrennt seine Sichtbarkeit ausgäbe?
Lo!
Hm, getBody hat doch kein Argument, oder? Laut Funktionsdokumentation ist der Datentyp jedenfalls void.
Ich habs auch schon mit
echo $message->getBody();
versucht, was den tollen Effekt hat, dass der Inhalt im Browser zwar angezeigt wird, im Quelltext aber steht:
Call to a member function getBody() on a non-object in ...
Es gibt zu keiner einzigen Methode der Klasse irgendein Beispiel - super dokumentiert!
Hi!
Hm, getBody hat doch kein Argument, oder? Laut Funktionsdokumentation ist der Datentyp jedenfalls void.
Ja. Aber auch in dem Fall sind die Klammern zu notieren. Bei send() hast du das ja auch gewusst/richtig gemacht.
Ich habs auch schon mit
echo $message->getBody();
versucht, was den tollen Effekt hat, dass der Inhalt im Browser zwar angezeigt wird, im Quelltext aber steht:
Call to a member function getBody() on a non-object in ...
Ein non-object ist eine Variable die kein Objekt ist. Von welchen Typ sie stattdessen ist, ist sagt dir var_dump().
Aus deinen Schnipsel ist nicht zu sehen, was du falsch machst. Möglicherweise steht $message im derzeitigen Geltungsbereich nicht zur Verfügung. (Auch ein Fehler in der HTTP-Erweiterung kann die Ursache sein, immerhin ist sie nur im PECL-Projekt angesiedelt.)
Wenn du anderen die Möglichekeit geben willst, den Fehler konkret zu suchen, musst du ihnen die dazu ein nachvollziehbares Beispiel liefern. Das sollte gerade so viel Code enthalten, dass der Fehler sichtbar ist. Mitunter verschwindet ein Fehler beim Erstellen solch eines Beispiels und es stellt sich heraus, dass eine bestimmte Bedingung an anderer Stelle die Ursache ist. Wenn du mit den gegebenen Hinweisen nicht zum Zuge kommst, erstell also bitte ein vollständiges Beispiel, mit dem das Problem nachvollziehbar ist.
Es gibt zu keiner einzigen Methode der Klasse irgendein Beispiel - super dokumentiert!
Das ist nicht dein Hauptproblem sondern deine verbesserungswürdige Grundlagenkenntnis.
Lo!
Hm, getBody hat doch kein Argument, oder? Laut Funktionsdokumentation ist der Datentyp jedenfalls void.
Doch, das Argument ist das Objekt, mit welchem die Methode aufgerufen wird, allgemein:
$object->method();
Du hast dann innerhalb der Methode das Objekt als erstes Argument, was in der Argumentenliste auf Position [0] zu finden ist.
Mit
$return_value = $object->method($argument_liste);
sollte nun auch der Sachverhalt der Rückgabe klar sein. Das Objekt und die zugehörigen Funktionen müssen in einer Klasse definiert sein. Falls Du mit einem Objekt, dessen Klasse bekannt ist, eine Funktion aufrufst, die nicht zur Klasse gehört:
$object->irgendeineFunktion();
sollte eine aussagekräftige Fehlermeldung erscheinen und Du weißt, wo die zu finden ist, i.d.R. auf dem Monitor, bei serverseitigen Scripts im error_log.
Es gibt zu keiner einzigen Methode der Klasse irgendein Beispiel - super dokumentiert!
Siehe Antwort von dedlfix. Wichtig ist auch das Wissen über Fehler~ und Warnmeldungen, bzw. wo die zu finden sind und wie die ein~ oder ausgeschaltet werden.
Hotti
Hi!
Doch, das Argument ist das Objekt, mit welchem die Methode aufgerufen wird, allgemein:
$object->method();
Du hast dann innerhalb der Methode das Objekt als erstes Argument, was in der Argumentenliste auf Position [0] zu finden ist.
Diese Aussage trifft nicht auf PHP zu.
Das Objekt und die zugehörigen Funktionen müssen in einer Klasse definiert sein.
Eine Klasse muss überhaupt nichts über die von ihr instantiierten Objekte wissen. Klassen sind abstrakte Gebilde beim Programmieren. Objekte entstehen erst zur Laufzeit. Ob überhaupt und wieviele ist möglicherweise von äußeren Bedingungen abhängig und völlig uninteressant für die Klasse. Die Verwaltung der Objekte obliegt dem Code, der sich auch um die anderen Variablen kümmert.
Lo!
hi,
Das Objekt und die zugehörigen Funktionen müssen in einer Klasse definiert sein.
Eine Klasse muss überhaupt nichts über die von ihr instantiierten Objekte wissen.
Zumindest sollte das Objekt wissen, zu welcher Klasse es gehört für den Fall, dass mit dem Objekt eine Klassen-Methode aufgerufen wird.
Falls das in PHP auch nicht so ist, ist mir das ab sofort egal. Ansonsten bin ich froh, dass ich mit Perl geordnete Verhältnisse habe in dieser Hinsicht. Alles Andere ist Spaghettikot.
Schöne Grüße,
Hotti
Hi!
Zumindest sollte das Objekt wissen, zu welcher Klasse es gehört für den Fall, dass mit dem Objekt eine Klassen-Methode aufgerufen wird.
Falls das in PHP auch nicht so ist, ist mir das ab sofort egal. Ansonsten bin ich froh, dass ich mit Perl geordnete Verhältnisse habe in dieser Hinsicht.
Geordnete Verhältnisse gibt es bei PHP in der Hinsicht auch. Nur solltest du sie nicht falsch erklären. Wenn dir trotzdem PHP egal wäre, würde ich das begrüßen, denn dann müsste man nicht immer einen Großteil deiner Aussagen korrigieren.
Lo!
Hi!
Ich möchte gerne den Body der Nachricht auslesen, wenn ich jedoch folgende Funktion benutze, erhalte ich nur ein leeres Ergebnis:
echo $message->getBody;
Setz das error_reporting zum Entwickeln immer auf E_ALL, dann hätte dir PHP gesagt, dass es eine Eigenschaft getBody nicht gibt. Daran hättest du sehen konnen, dass du eine Eigenschaft ansprichst und keine Methode aufrufst. Dafür fehlen schonmal die Klammern. Ob das Objekt eine Methode namens getBody() hat, siehst du mit der print_r-Ausgabe nicht. Aber das sollte ja dokumentiert sein.
Lo!