Wie macht man einen HTTP Put?

68

Wir haben diese Software, die eine Webservices-Komponente hat.

Jetzt ist der Administrator dieses Systems zu mir gekommen und möchte mithilfe der Webservices-Komponente Daten in das System importieren.

Also habe ich die Dokumentation gelesen, um herauszufinden, was passiert, und ich sehe solche Dinge:


Klicken Sie hier, um zu sehen, wovon ich spreche (dies sieht in Firefox, Chrome und Safari am besten aus).

Diese Dokumentation enthält Beispiele für die Interaktion mit dem System mithilfe von HTTP-Verben wie GET, POST, PUT, DELETE. Nach meiner begrenzten Erfahrung musste ich jedoch weder einen HTTP-PUT noch einen DELETE senden.

Wie machst du das? Ich habe HTML-Formulare mit method = "post" oder method = "get" erstellt und die Anforderung wird an alles gesendet, was im Aktionsattribut angegeben ist (action = "someResource"). Aber ich weiß nicht wirklich, was ich mit dieser PUT-Sache anfangen soll.

Wenn ich raten müsste, müsste ich eine Anwendung erstellen, die eine Art HTTP-Anforderungsobjekt erstellt, alle Eigenschaften festlegt und die Daten, die ich in die RESOURCE (


Ich versuche, die REST-Terminologie zu verwenden, was für mich sehr neu ist
). Dann würde ich die Anfrage mit meiner Programmiersprache und bla bla bla senden. Ich spekuliere nur darüber. Bitte bieten Sie Hilfe an!

Ich dachte, ich wäre ein Webentwickler, da ich Dinge wie XHTML, CSS, JavaScript usw. kenne, aber es sieht so aus, als wüsste ich überhaupt nichts über die Grundlagen des Webs (HTTP).

BEARBEITEN

PS: Ich programmiere hauptsächlich mit .net. Alle Beispiele in .net wären also ziemlich großartig.

Ronnie Overby
quelle
6
Ich denke nicht, dass diese Methoden veraltet sind, sondern dass sie ignoriert werden. Ich glaube, dass POST oft verwendet wird, um Dinge zu tun, für die es nicht wirklich gedacht war. RESTful-Entwicklungspraktiken zielen darauf ab, HTTP so zu verwenden, wie es verwendet werden soll. Habe ich recht damit? REST ist für mich ein neues Konzept.
Ronnie Overby
37
Lassen Sie mich das etwas stärker sagen. PUT und DELETE sind definitiv nicht veraltet. Browser machen es schwierig, PUT und DELETE auszuführen, aber Sie können immer Javascript und das XmlHttpRequest-Objekt verwenden.
Darrel Miller
5
PUT und DELETE werden zum Beispiel in WebDav verwendet, sicherlich nicht veraltet.
PQW
9
PUT und DELTE sind grundlegend für eine wirklich RESTful API
Nick Katsivelos
2
@R. Bemrose: Sie haben einen Ruf von> 23.000 und sagen, dass PUT / DELETE veraltet sind? Was in aller Welt bringt dich dazu, das zu sagen? Ich könnte sagen, dass sie für einige Zeit im Internet nicht wirklich verwendet wurden, aber sie werden heutzutage immer mehr (aufgrund von XHR).
Robert Koritnik

Antworten:

23

Hier ist ein C # -Beispiel mit HttpWebRequest:

using System;
using System.IO;
using System.Net;

class Test
{
        static void Main()
        {
                string xml = "<xml>...</xml>";
                byte[] arr = System.Text.Encoding.UTF8.GetBytes(xml);
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/");
                request.Method = "PUT";
                request.ContentType = "text/xml";
                request.ContentLength = arr.Length;
                Stream dataStream = request.GetRequestStream();
                dataStream.Write(arr, 0, arr.Length);
                dataStream.Close();
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                string returnString = response.StatusCode.ToString();
                Console.WriteLine(returnString);
        }
}

Update : Es gibt jetzt eine HttpClient-Klasse in System.Net.Http ( verfügbar als NuGet-Paket ), die dies etwas einfacher macht:

using System;
using System.Net.Http;

class Program
{
    static void Main()
    {
        var client = new HttpClient();
        var content = new StringContent("<xml>...</xml>");
        var response = client.PutAsync("http://localhost/", content).Result;
        Console.WriteLine(response.StatusCode);
    }
}
Jason DeFontes
quelle
Das sieht sehr vielversprechend aus. Ich werde das ausprobieren. Danke
Ronnie Overby
HttpWebRequest unterstützt keine anderen Verben als GET oder POST. Wenn Sie die Methode auf "PUT" setzen, wird eine NotSupportedException ausgelöst (scheiße, ich weiß!) - msdn.microsoft.com/en-us/library/…
user141682
8
@Luke Nur unter Silverlight wird PUT nicht unterstützt (Ihr Link führt zu den Silverlight-Dokumenten). Der obige Code läuft wie anders geschrieben.
Jason DeFontes
1
Vielen Dank! Das habe ich nicht bemerkt. Ich habe seitdem die HttpClient-Klasse aus dem WCF Rest Toolkit gefunden, was fantastisch ist.
user141682
Es ist 2018, das ist immer noch relevant, weil du es so einfach und klar gemacht hast. Was ich dachte ist, warum wir client.PutAsync () anstelle von PutAsXmlAsync () verwenden
Mese
15

Für PUT und DELETE müssen Sie wahrscheinlich AJAX verwenden und XMLHttpRequests erstellen, da das FORM-Tag nur GET- und POST-Verben unterstützt und Links nur GET-Anforderungen stellen.

Mit jQuery:

 $.ajax( {
       url: '/controller/action',
       type: 'PUT',
       data: function() { ...package some data as XML },
       dataType: 'xml',
       ... more options...
 );

Der Hinweis auf der Seite mit den jQuery Ajax-Optionen warnt, dass einige Browser PUT und DELETE für den Anforderungstyp nicht unterstützen. FWIW, ich habe noch nie PUT verwendet, aber DELETE in IE und FF verwendet. Nicht in Safari oder Opera getestet.

Tvanfosson
quelle
Ich werde wahrscheinlich nicht den Code schreiben, um dieses Problem für die Verwendung auf einem Webserver / Webbrowser zu lösen. Wahrscheinlich schreibe ich eine Konsolen- / Windows-App, die Daten aus einer Datenbank / Tabelle liest und dann in einer HTTP-Anfrage eine XML-Datei für PUT / POST / FART oder was auch immer zurück auf den Server erstellt. Der Zweck meiner Frage hier ist nur, einige Informationen über die Ausführung dieser unbekannten Verben zu erhalten. HAHAHAHA
Ronnie Overby
Sie könnten immer nur ein verstecktes Feld haben, das ein verstecktes "Methoden" -Feld hat, wenn Sie über ein HTML-Formular auf Ihre Rest-API zugreifen
brndnmg
8

So geht's in CURL: So verwenden Sie cURL zum Testen von RESTful Rails

Oder ... Sie können definitiv ein HTML-Formular verwenden. Wenn die App wirklich REST-fähig ist, versteht sie die REST-Aktionen und lässt Sie nur bestimmte Aktionen basierend auf der von Ihnen verwendeten Methode ausführen.

Tony
quelle
Wie sende ich das XML zurück an den Server, wenn ich ein HTML-Formular verwende (das ich nur zur Schulung / zum Proof of Concept ausprobieren möchte)?
Ronnie Overby
Holen Sie sich Curl für Windows hier: curl.haxx.se/download.html (beachten Sie nicht die einschüchternde Haxx in der URL!)
CGP
Schauen Sie sich den Kommentar von tvanfosson an. Es zeigt eine gute Möglichkeit, eine PUT-Anfrage zu stellen. Und dann sollte XML zurückgegeben werden ...?
Tony
6

Sie können kein HTML-Formular verwenden (die Spezifikation definiert nur GET / POST für Formulare).

Jede HTTP-API sollte Ihnen jedoch das PUT ermöglichen, genauso wie das GET oder POST. Hier ist beispielsweise die Java HTTPClient-Dokumentation , in der PUT neben allen anderen HTTP-Verben aufgeführt ist.

Ich weiß nicht, welche Sprache Sie verwenden, aber ich denke, es wird ziemlich trivial sein, eine App zu schreiben, um einen HTTP-PUT durchzuführen.

Brian Agnew
quelle
6

Ich fand diese wirklich coole kostenlose Software namens RESTClient .

Sie können mit verschiedenen Verben mit HTTP-Ressourcen interagieren, Header und Text manuell festlegen, Authentifizierungsinformationen, SSL festlegen, Testskripte ausführen usw.

Dies wird mir helfen, herauszufinden, wie ich mit unserer "Webservices" -Software interagieren kann, die eigentlich nur eine RESTful-API für die Datenbank der Software ist.

Ronnie Overby
quelle
1

Hier ist ein Tool, mit dem Sie Drag & Drop in PUT-Dateien ziehen können

Yishai
quelle
Ich bin nicht daran interessiert, Dateien per Drag & Drop auf einen Server hochzuladen. Ich möchte die HTTP-Put-Methode verwenden, um XML an einen Server zu senden.
Ronnie Overby
Wenn die Datei XML wäre, würde sie dies tun.
Yishai
1

"Jetzt ist der Administrator dieses Systems zu mir gekommen und möchte mithilfe der Webservices-Komponente Daten in das System importieren."

Webdienste haben wenig mit HTML-Formularen zu tun.

Webdienstanforderungen werden entweder über Javascript (z. B. als Ajax) oder über Ihre Anwendungsprogramme ausgeführt.

Sie würden ein C # - oder VB-Programm schreiben, das HTTP verwendet, um einen Put an die angegebene Webdienst-URL mit dem angegebenen Datensatz durchzuführen.

Hier ist zum Beispiel ein Beispiel für einen VB-Code: http://developer.yahoo.com/dotnet/howto-rest_vb.html#post

Ersetzen Sie die Methodenzeichenfolge von "POST" durch "PUT".

S.Lott
quelle
0

Nur ein Headsup, das einige Netzwerkadministratoren aus verschiedenen Gründen blockieren. Daher müssen Sie möglicherweise einen POST anstelle von PUT verwenden. Erkundigen Sie sich bei Ihren Operationen.

Srikar Doddi
quelle
Dies alles wird in unserem LAN geschehen. Ich muss mir keine Sorgen machen, dass es blockiert wird.
Ronnie Overby
1
Ich muss lieben, wie Netzwerkadministratoren legitimes HTTP blockieren. Es ist ein Wunder, dass wir sie dazu bringen können, Ajax überhaupt zuzulassen!
Runako
0

PUT und DELETE sind nicht Teil von HTML4, aber in den HTML5-Spezifikationen enthalten. Aus diesem Grund haben die meisten gängigen Browser keine gute Unterstützung für sie, da sie sich auf HTML4 konzentrieren. Sie sind jedoch definitiv Teil von HTTP und waren es schon immer. Sie führen einen PUT mit einem Nicht-Browser-Client oder mit einem Formular in einem HTML5-fähigen Browser durch.

Update: PUT und DELETE sind nicht mehr Teil von HTML5 für Formulare. Siehe: http://www.w3.org/TR/html5/association-of-controls-and-forms.html#attr-fs-method

aehlke
quelle
1
PUT und DELETE sind (auch) nicht mehr in HTML5.
Julian Reschke