Das Problem besteht darin, dass Header und Body in der Antwort normalerweise durch die erste gefundene leere Zeile getrennt werden, außer dass in diesem Fall die leere Zeile nach dem steht 100 Continue und daher wird alles andere in den Körper geschoben – und das ist kein gültiger json mehr 🙂
Meine Frage ist also: Wie geht man üblich damit um? Ich habe 3 Optionen in der Reihe:
Geben Sie an, dass curl nicht erwartet werden soll 100-continue? (Wie?)
Festlegen, dass curl nur die Header der letzten Antwort zurücksenden soll? (Wie?)
Suchen Sie manuell nach 100 Continue Kopfzeilen und ignorieren sie und ihre folgende leere Zeile? (Gibt es in diesem Fall andere ähnliche Dinge, die passieren könnten, die ich manuell überprüfen sollte?)
Wenn ich nicht etwas Offensichtliches übersehe, bin ich sicher, dass die Leute darüber gestolpert sind und es viele Male gelöst haben!
Stellst du ein curl_setopt($ch, CURLOPT_HEADER, 0) und Curl den Antworttext von den Headern für Sie trennen lassen?
– Lèse Majesté
6. Juli 2012 um 9:41 Uhr
@Lèsemajesté Nein, ich trenne sie manuell. Wenn ich curl die Header vom Körper trennen lasse, gibt es dann noch eine Möglichkeit, die Header zu inspizieren?
– jgivoni
6. Juli 2012 um 10:09 Uhr
Sie können die Header erhalten gesendet verwenden CURLINFO_HEADER_OUT; Sie könnten jedoch die empfangenen Header nicht abrufen, abgesehen von bestimmten Headern wie dem letzten Antwortcode, dem Inhaltstyp, der Inhaltslänge und vielleicht einigen anderen. Wenn Sie also alle Antwortheader benötigen, ist die Verwendung wahrscheinlich die beste Option curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD) oder CURLINFO_HEADER_SIZE und trennen Sie den Körper selbst von den Kopfzeilen.
– Lèse Majesté
6. Juli 2012 um 11:52 Uhr
@Lèsemajesté Der Content-Type wäre schön zu haben. Mal sehen, ob es jemandem gelingt, mit CURLINFO_HEADER_SIZE eine Antwort mit Code zu erstellen.
– jgivoni
6. Juli 2012 um 13:00 Uhr
ts.
Ich entscheide mich für #1. Sie können curl zwingen, einen leeren „Expect“-Header zu senden, indem Sie Folgendes hinzufügen:
Wenn Sie es manuell überprüfen möchten, sollten Sie Ihren eigenen Header-Callback definieren und möglicherweise einen Callback schreiben (suchen Sie nach CURLOPT_HEADERFUNCTION und CURLOPT_WRITEFUNCTION in curl_setopt doc), der einfach alle “HTTP/1.1 100 Continue”-Header ignorieren muss.
Könnte das entfernen Expect Header übrigens irgendwelche anderen Auswirkungen auf den Anfrage/Antwort-HTTP-Dialog?
– jgivoni
6. Juli 2012 um 9:45 Uhr
@jgivoni Wenn die Möglichkeit besteht, die Anfrage abzulehnen (z. B. per Webservice), besteht ein Risiko. Der Zweck von „100 – Fortfahren“ besteht darin, die POST-Anforderung vorab zu validieren, bevor der gesamte Text gesendet wird (w3.org/Protocols/rfc2616/rfc2616-sec8.html). Wenn kein Risiko des Rückgangs besteht (oder es relativ gering ist), sollten Sie keine Probleme haben.
– ts.
6. Juli 2012 um 12:24 Uhr
Ich wähle diese Antwort aus, weil sie zu meinen speziellen Bedürfnissen passt. Wenn ich einen Webservice anrufe, über den ich selbst die Kontrolle habe, besteht kein Risiko, die Anfrage abzulehnen.
– jgivoni
6. Juli 2012 um 13:46 Uhr
Hier ist eine andere Methode, die den Ansatz verwendet, den ich im Kommentar beschrieben habe, indem die Antwort mithilfe von Header vs. Body analysiert wird CURLINFO_HEADER_SIZE:
Sie müssen zwei Arrays vorbereiten: 1- Post-Feld mit normalen Daten: (name1 = val1, name2 = val2, …) 2- post-Feld mit Dateidaten: (name_file 1, path_file1, name_file2 = path_file2, ..)
und rufen Sie schließlich diese Funktion auf, bevor Sie curl so ausführen. $r = curl_custom_postfields($curl, $post, $postfields_files);
Ich bin bei 100s und 302s usw. darauf gestoßen, es ist ärgerlich, aber manchmal erforderlich (gdata-Aufrufe usw.), also würde ich sagen, dass curl alle Header zurückgibt und der Körper etwas anders extrahiert wird.
Ich handhabe es so (kann meinen eigentlichen Code nicht finden, aber Sie werden die Idee bekommen):
Ich lehne die langatmige Hack-Methode ab (ich würde es vorziehen, wenn Curl den Körperinhalt irgendwie markieren würde), aber es hat im Laufe der Jahre gut funktioniert. lass uns wissen wie es dir geht.
10552800cookie-checkPHP curl_exec gibt sowohl HTTP/1.1 100 Continue als auch HTTP/1.1 200 OK getrennt durch Leerzeichen zurückyes
Stellst du ein
curl_setopt($ch, CURLOPT_HEADER, 0)
und Curl den Antworttext von den Headern für Sie trennen lassen?– Lèse Majesté
6. Juli 2012 um 9:41 Uhr
@Lèsemajesté Nein, ich trenne sie manuell. Wenn ich curl die Header vom Körper trennen lasse, gibt es dann noch eine Möglichkeit, die Header zu inspizieren?
– jgivoni
6. Juli 2012 um 10:09 Uhr
Sie können die Header erhalten gesendet verwenden
CURLINFO_HEADER_OUT
; Sie könnten jedoch die empfangenen Header nicht abrufen, abgesehen von bestimmten Headern wie dem letzten Antwortcode, dem Inhaltstyp, der Inhaltslänge und vielleicht einigen anderen. Wenn Sie also alle Antwortheader benötigen, ist die Verwendung wahrscheinlich die beste Optioncurl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD)
oderCURLINFO_HEADER_SIZE
und trennen Sie den Körper selbst von den Kopfzeilen.– Lèse Majesté
6. Juli 2012 um 11:52 Uhr
@Lèsemajesté Der Content-Type wäre schön zu haben. Mal sehen, ob es jemandem gelingt, mit CURLINFO_HEADER_SIZE eine Antwort mit Code zu erstellen.
– jgivoni
6. Juli 2012 um 13:00 Uhr