2013-05-22 6 views
13

Ich fühle mich wie ich etwas vermisse, aber nachdem ich die Dokumente für net/url durch und stochern im Allgemeinen, war ich nicht in der Lage, eine Möglichkeit zum Ausstellen einer GET Anfrage aus der interaktive Eingabeaufforderung. Im Grunde möchte ich meinen Python-Workflow zum Stöbern auf einer Website nachahmen:Ausgabe eines HTTP GET von REPL im Racket

ist dies in Racket durchführbar?

Antwort

12

Mit call/input-url hat einige Vorteile:

  • Sie müssen den Port nicht selbst schließen.
  • Der Port ist geschlossen, auch wenn eine Ausnahme vorliegt.
  • Das dritte Argument ist (input-port? -> any/c) - das ist eine Funktion, die eine input-port nimmt und alles zurückgibt. Zusätzlich zu einer Funktion, die Sie selbst schreiben, könnte dies eine bereits definierte Funktion wie port->string, read-html-as-xml und so weiter sein.

Zum Beispiel:

(call/input-url (string->url "http://www.google.com/") 
       get-pure-port 
       port->string) 

Hinweis: Da ich diese Antwort tippte, merke ich, dass Óscar seine bearbeitet Umleitungen zu tun. Ähnliche bearbeiten wäre:

(call/input-url (string->url "http://www.google.com/") 
       (curry get-pure-port #:redirections 4) 
       port->string) 

Natürlich, so oder so noch recht ausführlich ist häufig an der REPL einzugeben. Also Óscar Vorschlag, Ihre eigene url-open Funktion zu definieren, ist eine gute. Es wäre vorzuziehen, es mit call/input-url zu implementieren, denke ich.

+1

Gibt es eine Möglichkeit, den Statuscode zu extrahieren, außer die Header manuell zu analysieren? Ich bin überrascht, dass ich keine Hilfsfunktion dafür finden konnte, entweder im richtigen Racket oder in Ihrer http-Bibliothek. – offby1

+0

Sorry, ich habe deinen Kommentar bis jetzt noch nicht bemerkt! Meine http-Lib hat Funktionen, um dies zu tun: https://github.com/gregerhendershott/http/blob/master/http/head.rkt#L22-L45 –

7

Versuchen Sie folgendes:

(require net/url) 

(define input (get-pure-port (string->url "http://www.someurl.com"))) 
(define response (port->string input)) 
(close-input-port input) 

Nun ist die response Variable, die den HTTP-Antwort vom Server enthalten wird. Noch besser ist, in einem Verfahren, das oben packen, auch feststellen, dass ich eine maximale Anzahl von Umleitungen erlaubt hinzugefügt:

(define (urlopen url) 
    (let* ((input (get-pure-port (string->url url) #:redirections 5)) 
     (response (port->string input))) 
    (close-input-port input) 
    response)) 

(urlopen "http://www.someurl.com") ; this will return the response 

EDIT:

@ ausgezeichneter Beratung GregHendershott des verfolgt (siehe seine Antwort für Details), hier ist eine andere, robustere Art und Weise die gewünschte Funktionalität zu implementieren:

(define (urlopen url) 
    (call/input-url 
    (string->url url) 
    (curry get-pure-port #:redirections 5) 
    port->string))