POST-Submit per C++



  • Hi ihr.
    Und zwar hab ich folgendes geplant... ich möchte ein in Visual C++ 2005 Express Daten aus TextBoxen über die POST-Methode (www-POST) versenden.
    Nach einiger Suche hab ich das hier gefunden:

    asURL = "http://www.demoseite.at/submit.php";
    hReq = HttpOpenRequest(hConn, "POST", asURL.c_str(), NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION |INTERNET_FLAG_TRANSFER_BINARY, 0);

    Soweit ich das verstehe, wird eine POST-Verbindung zur URL aufgebaut. Allerdings nun die Frage, wie übermittle ich die entsprechenden Formulardaten (sind in String-Variablen mit den Beispielsnamen FeldA,FeldB usw. abgelegt).
    Sprich, wer etwas PHP versteht (das soll der Server erhalten):

    $_POST['FeldA'] = 'Wert1';
    $_POST['FeldB'] = 'Wert2';
    

    in der Anwendung sollen damit eben diese Strings gesendet werden:

    System::String^ FeldA = "Wert1";
    System::String^ FeldB = "Wert2";
    

    Und dann noch die passende Gegenfrage: Wie kann ich danach die Antwort des Servers in einen String abfangen?

    Sorry, wenn die Frage schon öfters mal vorkam, aber das ist für mich absoltes Neuland (wenn überhaupt direkt .NET ist)



  • Ein wenig Spielzeug:

    using namespace ErgebnisUpload;
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::Net;
    using namespace System::Text;
    using namespace System::IO;
    
    /************************************************************************/
    /* Bereitet den HTTPRequest mit Post Daten vor                                                                      
    /*
    /************************************************************************/
    void preparePost(HttpWebRequest ^ request,System::String ^ postData)
    {
    
    	CredentialCache ^myCache = gcnew CredentialCache(); 
    	Net::NetworkCredential ^ cred = gcnew NetworkCredential(Benutzer, Passwort);
    
    	myCache->Add(request->RequestUri,"Basic", cred); 
    	request->Credentials = myCache;
    
    	ASCIIEncoding ^encoding = gcnew ASCIIEncoding();
    	array<unsigned char>^  data = encoding->GetBytes(postData);
    
    	request->Method = WebRequestMethods::Http::Post;
    	request->ContentType="application/x-www-form-urlencoded";
    	request->ContentLength = data->Length;
    	Stream ^ newStream=request->GetRequestStream();
    	newStream->Write(data,0,data->Length);
    	newStream->Close();
    }
    
    /************************************************************************/
    /* Führt den Request aus, holt das Ergebnis ab und liefert es als String^                                                                     
    /************************************************************************/
    System::String^	dorequest(HttpWebRequest ^ request)
    {
    		request->PreAuthenticate = true;
    
    		HttpWebResponse ^response = static_cast<HttpWebResponse^>(request->GetResponse());
    		Stream^ responseStream = response->GetResponseStream();
    		StreamReader ^ streamReader = gcnew StreamReader(responseStream);
    		return streamReader->ReadToEnd();
    }
    
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    	try
    	{
    
    		if(args->Length < 6)
    		{
     return 20;
    		}
    		args[0]->Trim();
    		if(args[0] == System::String::Empty)
    			return 20;
    
    		System::String ^ url = gcnew System::String("https://<domain>aktualisieren.php");
    		String ^	postData  = "Kundennummer="+ args[0];
    					if(args[1] != "")
    						postData += "&Eingang="  + System::DateTime::Parse(args[1]).ToString("yyyy.MM.dd");
    
    		HttpWebRequest ^ request = static_cast<HttpWebRequest ^>(WebRequest::Create(url));
    
    		preparePost(request,postData);
    		System::String ^ res =   dorequest(request);
    
    		if(res == "OK")
    			return 0;
    		else
    			return 20;
    	} 
    	catch (Exception^ e)
    	{
    		return 20;
    	}
    }
    

    Auch wenns nich oft gefragt ist: FAQ ?



  • Ah, dank dir. Ich hab jetzt ein paar Dinge dran umgebaut, da ich u.a. keinen Benutzerzugang brauche...
    Wenn ich das richtig verstanden habe (hat mein Test auch bewiesen) werden POST-Daten letztendlich auch wie GET-Daten übertragen, also z.B.
    ?feldA=wert1&feldB=wert2
    Hab jetzt das ganze mal so gebaut:

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::Net;
    using namespace System::Text;
    using namespace System::IO;
    //************************************************************************/ 
    /* Bereitet den HTTPRequest mit Post Daten vor
    /************************************************************************/ 
    void preparePost(HttpWebRequest ^ request,System::String ^ postData) 
    { 
        ASCIIEncoding ^encoding = gcnew ASCIIEncoding(); 
        array<unsigned char>^  data = encoding->GetBytes(postData); 
        request->Method = WebRequestMethods::Http::Post; 
        request->ContentType="application/x-www-form-urlencoded"; 
        request->ContentLength = data->Length; 
        Stream ^ newStream=request->GetRequestStream(); 
        newStream->Write(data,0,data->Length); 
        newStream->Close(); 
    } 
    /************************************************************************/ 
    /* Führt den Request aus, holt das Ergebnis ab und liefert es als String^                                                                     
    /************************************************************************/ 
    System::String^    dorequest(HttpWebRequest ^ request,System::String ^ url) 
    { 
            request->PreAuthenticate = true; 
            HttpWebResponse ^response = static_cast<HttpWebResponse^>(request->GetResponse()); 
            Stream^ responseStream = response->GetResponseStream(); 
            StreamReader ^ streamReader = gcnew StreamReader(responseStream); 
            return streamReader->ReadToEnd(); 
    } 
    [STAThreadAttribute] 
    System::String^ ladeWebdaten(System::String^ postData)
    	{
    	try 
    		{ 
    		System::String^ url = gcnew System::String("http://127.0.0.1/app/index.php"); 
            HttpWebRequest^ request = static_cast<HttpWebRequest ^>(WebRequest::Create(url)); 
            preparePost(request,postData); 
            System::String^ res =   dorequest(request,url); 
    		return res;
    		}
    	catch (Exception^ e) 
    		{ 
    		// Fehler (noch erstellen)
    		return "";
    		} 
    	}
    

    Also wiegesagt, das ganze hier funktioniert bisher einwandfrei. Aber falls jemand einen (möglichen) Fehler (oder irgendwelche Exceptions) noch sehen sollte, einfach was zu sagen 😉

    Thx.



  • Bei dorequest kannst Du die URL weglassen, war noch nen C&P Fehler als ich das aus nem Projekt zusammenstellte.

    Die Benutzerauthentifizierung hab ich drinne gelassen, ich hatte ne weile in der MSDN gesucht bis ich das zusammen hatte. Das auszubauen war ja nich das Problem ;o)


Log in to reply