2010-12-22 8 views
1

zurückgeben Ich habe ein CGI-Skript, das eine Menge Dinge tut. Ich versuche das Skript sehr einfach und portabel zu halten. Ich brauche nur eine Möglichkeit für den Benutzer, eine Nachricht an den Server zu senden, ohne die aktuelle Seite zu verlieren. Bisher habe ich folgenden Prozess:Wie ein "Noop" Dokument über HTTP

  1. Benutzer lädt eine "Statusseite" aus einem CGI-Skript.
  2. Die Statusseite hat einen JavaScript-Timer, der alle zwei Sekunden Daten (nicht die gesamte Seite) vom Server liest und die Statusseite entsprechend ändert.
  3. Der Benutzer klickt auf ein Hyperlink-Element, um einen Job auf dem Server zu starten.
  4. Das CGI empfängt die Parameter vom Klick und startet den Job.
  5. Die CGI sendet eine Antwort von \n

An diesem Punkt Firefox die Benutzer fragt, ob sie die CGI-Skript und natürlich das Skript ist nur die \n, dass der CGI gesendet herunterladen mögen. Stattdessen möchte ich, dass der Browser die Antwort vollständig ignoriert. Wenn mein CGI-Skript keinen \n Echo widergibt gibt ein Fehler. Was kann ich tun, um dem Browser mitzuteilen, dass er die Antwort ignorieren und auf der aktuellen Seite bleiben soll? Beachten Sie, dass ich die aktuelle Seite nicht neu laden möchte. Ich denke, es muss eine Art "Noop" HTTP-Antwort für einen solchen Fall geben.

+0

FWIW, der Begriff ist "NOP". –

+3

@Noon: Der Begriff [NOOP] (http://ftpguide.com/NOOP.htm) ist [genauso gültig] (http://en.wikipedia.org/wiki/NOP). – cdhowie

+1

Wie wäre es mit einem Kompromiss: NEIN ½ – User1

Antwort

3

Senden Sie eine Antwort mit dem HTTP-Statuscode 204 zurück. Von RFC 2616 aka Hypertext Transfer Protocol -- HTTP/1.1:

10.2.5 204 No Content

Der Server die Anforderung erfüllt hat aber keinen gesonderten einheits Körper zurückzukehren, und vielleicht aktualisiert Metainformationen zurückkehren möchten. Die Antwort Mai neue oder aktualisierte Metainformation in Form von Entity-Header enthalten, die, wenn vorhanden sollte mit der angeforderten Variante zugeordnet werden.

Wenn der Kunde ein User-Agent ist, es seine, sollten Sie nicht Dokumentansicht aus, dass ändern, die die Anforderung an gesendet werden, verursacht. Diese Antwort ist in erster Linie soll Eingang statt für Aktionen ermöglichen, ohne eine Änderung an der User-Agent des aktiven Dokumentansicht verursacht, obwohl jede neue oder aktualisierte Metainformationen SOLL angewendet werden aktiv das Dokument derzeit in der Benutzer Agenten Aussicht.

Die 204 Antwort enthalten darf keinen Nachrichten Körper und ist somit immer durch die ersten leeren Zeilen Felder nach dem Header beendet.

+0

Schön. Genau das habe ich gebraucht! – User1

+0

Das ist wirklich interessante Information. Vielen Dank! – Pointy

1

Anstatt zu versuchen, dieses Problem auf der Serverseite zu lösen, möchten Sie möglicherweise eine Client-seitige Lösung untersuchen. Mit jQuery können Sie beispielsweise einfach einen AJAX asynchronous request Server per Knopfdruck initiieren. Sie müssen keine neue Seite im Browser laden.

1

Anstatt den Hyperlink eine echte <a> oder <form> mit Standardverhalten zu haben, müssen Sie ein klickbares Element sein, dessen Klicks durch Ihren clientseitigen Code behandelt werden. Der JavaScript-Code sollte die Jobanforderungen mit XMLHttpRequest-Objekten senden, damit er vollständig steuern kann, wie die Antwort gehandhabt wird.

+0

Ich habe darüber nachgedacht und ich bin sicher, es würde funktionieren. Das CGI-Skript hat jedoch viele Ebenen, nur um den Link erscheinen zu lassen. AJAX oder jQuery würde es ziemlich hässlich machen im Vergleich zu einer einfachen HTTP-Antwort, die der Browser ignoriert. – User1

+0

@ User1 Nun, das Problem ist, dass die Semantik von HTTP einfach nicht bieten, was Sie fragen. Wenn Sie auf einen Link klicken (oder ein Formular posten), indem Sie die einfachen Grundfunktionen des einfachen Browsers verwenden, dann kommt Hell oder High Water, der Browser erwartet etwas zu laden, um die aktuelle Seite zu ersetzen. – Pointy

+0

@ User1 Nun, ich denke, ich lerne jeden Tag etwas :-) Danke für die Frage! Sobald Sie jedoch Ihren Server eine Antwort zurückgeben müssen, um anzugeben, ob es * möglich * ist, den angeforderten Job zu starten, kehren Sie zu XMLHttpRequest zurück. – Pointy