Ankündigung

Einklappen
Keine Ankündigung bisher.

Html/json

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Html/json

    ich weiß nicht in welche Rubrik dieser Thread gehört,
    bitte ggf. verschieben.

    Ich beschäftige mich mal wieder mit der sendgrid-API:
    http://docs.sendgrid.com/documentation/api/event-api/

    Dort steht:
    Please note that currently the POST headers define this post as application/json, though it's not; each line is a valid JSON string, but the overall POST body is not.
    Kapier ich nicht:
    was sind denn "POST headers" und "overall POST body" ??

  • #2
    http post header:

    POST /wiki/Spezial:Search HTTP/1.1
    Host: de.wikipedia.org
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 24

    post body :


    search=Katzen&go=Artikel

    oder ich irre mich jetzt mal wieder arg

    http://de.wikipedia.org/wiki/Hyperte...nsfer_Protocol

    Kommentar


    • #3
      PHP-Code:
      print_r($HTTP_RAW_POST_DATA
      oder?

      Kommentar


      • #4
        alles Mist, da kommt nix an.

        Kommentar


        • #5
          always_populate_raw_post_data ist bei mir Off.

          Hat das was damit zu tun ?

          Ich nehm die Daten ja nur entgegen von nem fremden Server.

          Ich hab jetzt das Testscript von sendgrid eingebaut und erhalte bei print_r:
          {"email":"xxx@freenet.de","timestamp":1347119800," template":"12","jobid":"20539","event":"open"}

          Also ist in $HTTP_RAW_POST_DATA kein Array
          sondern beinhaltet in diesem Fall ein oder mehrere json-Objekte.
          Mehrere Events werden in der Form zurückgegeben:
          {"email":"foo@bar.com","timestamp":1322000095,"unique_arg":"my unique arg","event":"delivered"}
          {"email":"foo@bar.com","timestamp":1322000096,"unique_arg":"my unique arg","event":"open"}
          Also per Newline getrennte JSON-Objekte.

          Und wie komm ich jetzt an die einzelnen Daten ?

          Auf jede Zeile json_decode anwenden ?

          Was für ein Quark ...

          Testscript:
          PHP-Code:

          if(isset($HTTP_RAW_POST_DATA)){

              
          $fh fopen('logs/dump.txt''a+');
              
              if(
          $fh){
                  
                  
          // Dump body
                  
          fwrite($fhprint_r($HTTP_RAW_POST_DATAtrue));
                  
          fclose($fh);
              }

          Kommentar


          • #6
            so, hier noch meine Lösung:

            PHP-Code:
            <?php
            error_reporting
            (E_ALL); // im Produktiveinsatz ausschalten

            /* Version mit batched events

            sendgrid events:
            Processed         Message has been received and is ready to be delivered.
            Dropped         Recipient exists in one or more of your Suppression Lists: Bounces, Spam Reports, Unsubscribes.
            Delivered         Message has been successfully delivered to the receiving server.
            Deferred         Recipient's email server temporarily rejected message. Refer to our article on throttling.
            Bounce             Receiving server could not or would not accept message.
            Open             Recipient has opened the HTML message.
            Click             Recipient clicked on a link within the message.
            Spam Report     Recipient marked message as spam.
            Unsubscribe     Recipient clicked on messages's subscription management link.

            Daten kommen als application/json an, z.B.:
            {"email":"foo@bar.com","timestamp":1322000095,"unique_arg":"my unique arg","event":"delivered"}
            {"email":"foo@bar.com","timestamp":1322000096,"unique_arg":"my unique arg","event":"open"}
            */

            // Dateien includen welche die DB-Verbindung herstellen und ein paar Hilfsfunktionen bereitstellen
            include 'include/config.php';
            include 
            'include/functions.php';


            if(isset(
            $HTTP_RAW_POST_DATA)){
                    
                
            // body holen
                
            $dump print_r($HTTP_RAW_POST_DATAtrue);
                
                
            $tmp explode("\n"$dump);
                
                
            // Schleife über alle Zeilen (JSON-Objekte)
                
            foreach($tmp as $key => $value){

                    
            // JSON decodieren, so daß ein assoziatives Array zurückgeliefert wird
                    
            $obj json_decode($valuetrue);
                
                    
            $email = (isset($obj['email'])) ? $obj['email'] : ''
                    
                    
            // jobid und template wurden von mir ursprünglich übergeben als "unique_args"
                    
            $jobid = (isset($obj['jobid'])) ? (int) $obj['jobid'] : 0
                    
            $template = (isset($obj['template'])) ? (int) $obj['template'] : 0
                
                    
            // in DB eintragen falls die wichtigsten Werte vorhanden sind
                    
            if(!empty($email) && !empty($jobid) && !empty($template)){
                    
                        
            $event = (isset($obj['event'])) ? $obj['event'] : '';
                        
            $timestamp = (isset($obj['timestamp'])) ? (int) $obj['timestamp'] : 0;

                        
            $sql "INSERT INTO `tabelle` (`id`, `email`, `event_date`, `event`, `jobid`, `template`, `raw_post_data`) VALUES (NULL, '".mysql_real_escape_string($email)."', FROM_UNIXTIME('".$timestamp."'), '".mysql_real_escape_string($event)."', '".$jobid."', '".$template."', '".mysql_real_escape_string($value)."')";

                        
            query($sql); // kommt aus der functions.php
                    
            }
                }
            }

            // Die API erwartet als HTTP-Response-Code "200 OK".
            // Eine schlichte HTML-Seite dürfte das erzeugen
            ?>
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <title>Sendgrid API Response</title>
            </head>
            <body>
            <p>ok</p>
            </body>
            </html>
            Falls jemand Verbesserungsvorschläge hat
            oder grobe Fehler sieht: bitte posten.

            Kommentar


            • #7
              Supi.

              Also ist in $HTTP_RAW_POST_DATA kein Array
              Weiß ich auch nicht, wo Du das rausgelesen haben willst. RAW_POST ist nie ein Array. Kann gar nicht. Das ist der pure Request-Body. Warum manche APIs das statt der normalen POST-Evaluation benutzen, erschließt sich mit allerdings auch nicht. Mit XML habe ich sowas auch schon gesehen.

              Kommentar


              • #8
                na ja, eben weil POST auch ein Array ist und weil ich print_r immer in Zusammenhang mit Arrays verwende.

                Kommentar


                • #9
                  Ach so, ja warum die Doku da auf print_r verweis, weiß ich auch nicht.

                  Kommentar

                  Lädt...
                  X