Announcement

Collapse
No announcement yet.

POST an eine PHP API im Web

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • POST an eine PHP API im Web

    Hallo Liebe Entickerforum Gemeinde,

    ich habe im Web eine Datei, welche mir auf einen POST eine XML antwort liefert z.B.:

    Ich gebe in EditBox1 den Text "testuser" ein.
    Der Text "testuser" wird per POST an die im Web liegende PHP Datei gesendet.

    Diese Antwortet mit XML
    <user>testuser</user>
    <gewicht>59</gewicht>
    <alter>22</alter
    <klasse>5</klasse>

    Nun möchte ich:

    a) Den eingegebenen Text an die PHP Datei schicken (VB.NET / Forms) und
    b) Die XML Antwort in Variablen fangen dim user as string, usw...

    Wenn jemand von euch da was brauchbares hat, ich wäre sehr erfreud über Hilfe.

    Danke und Liebe Grüße,

    Tux

  • #2
    Bin schon etwas weiter, bekomme nun den Fehler:

    Die zugrunde liegende Verbindung wurde geschlossen: Für den geschützten SSL/TLS-Kanal konnte keine Vertrauensstellung hergestellt werden..

    Mein Code:
    Code:
     Sub Anmeldung(ByVal username As String)
    
            Dim request As HttpWebRequest
            Dim response As HttpWebResponse = Nothing
            Dim reader As StreamReader
            Dim address As Uri
            Dim query As String
            Dim data As StringBuilder
            Dim byteData() As Byte
            Dim postStream As Stream = Nothing
    
    
            address = New Uri("https://localhost/secure/api/anmeldung.php")
    
            request = DirectCast(WebRequest.Create(address), HttpWebRequest)
    
            request.Method = "POST"
            request.ContentType = "application/x-www-form-urlencoded"
    
            query = username
    
            data = New StringBuilder()
            data.Append("query=" + HttpUtility.UrlEncode(query))
    
            ' Create a byte array of the data we want to send
            byteData = UTF8Encoding.UTF8.GetBytes(data.ToString())
    
            ' Set the content length in the request headers
            request.ContentLength = byteData.Length
    
            ' Write data
            Try
                postStream = request.GetRequestStream()
                postStream.Write(byteData, 0, byteData.Length)
    
            Finally
                If Not postStream Is Nothing Then postStream.Close()
            End Try
    
            Try
                ' Get response
                response = DirectCast(request.GetResponse(), HttpWebResponse)
    
                ' Get the response stream into a reader
                reader = New StreamReader(response.GetResponseStream())
    
                ' Console application output
                Console.WriteLine(reader.ReadToEnd())
            Finally
                If Not response Is Nothing Then response.Close()
            End Try
    
        End Sub

    Comment


    • #3
      Hallo,

      hab dein Problem nicht nachvollzogen, allerdings geht hervor dass der Fehler darauf beruht dass das SSL-Zertifikat nicht verifiziert werden kann.

      Um diesem Problem aus dem Weg zu gehen wird eine Klasse implementiert die alle Zertifikate akzeptiert.

      Beispielsweise so:
      Code:
      Imports System.Net
      Imports System.Security.Cryptography.X509Certificates
      
      Public Class MyPolicy
          Implements ICertificatePolicy
          Public Sub New()
          End Sub
             
          ' Implementierung der Schnittstelle:
          Public Function CheckValidationResult(ByVal srvPoint As ServicePoint, ByVal certificate As X509Certificate, ByVal request As WebRequest, ByVal certificateProblem As Integer) As Boolean
              Return True
          End Function
      End Class
          
      Public Class Program
          Public Shared Sub Main(ByVal args As String())
              ServicePointManager.CertificatePolicy = New MyPolicy()
      
              ' Zugriff auf SSL-Seite:
              << Code hier >>
              End Sub
      End Class
      Hoffe es hilft dir.

      mfG Gü
      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

      Comment


      • #4
        Bei deinem Beispiel sagt er:

        Fehler 1 Class "MyPolicy" muss "Function CheckValidationResult(srvPoint As ServicePoint, certificate As Security.Cryptography.X509Certificates.X509Certifi cate, request As WebRequest, certificateProblem As Integer) As Boolean" für die System.Net.ICertificatePolicy-Schnittstelle implementieren. C:\Visual Studio 2005\Projects\HTTPrequest\HTTPrequest\MyPolicy.vb 8 16 HTTPrequest
        Zuletzt editiert von Tux; 20.09.2008, 14:42.

        Comment


        • #5
          Hi,

          da ich VB.net nicht kann hab ich meinen C# automatisch übersetzen lassen. Bin auch draufgekommen dass der so erstellte VB.Code die Schnittstelle nicht implementiert (während du deinen Post geändert hast).

          Hier mal die C#-Variante:
          Code:
          using System.Net;
          using System.Security.Cryptography.X509Certificates;
          
          namespace ConsoleApplication1
          {
          	public class MyPolicy : ICertificatePolicy
          	{
          		public MyPolicy() { }
          
          		// Implementierung der Schnittstelle:
          		public bool CheckValidationResult(
          			ServicePoint srvPoint, 
          			X509Certificate certificate, 
          			WebRequest request, 
          			int certificateProblem)
          		{
          			return true;
          		}
          	}
          
          	public class Program
          	{
          		static void Main(string[] args)
          		{
          			ServicePointManager.CertificatePolicy = new MyPolicy();
          
          			// Zugriff auf SSL-Seite:
          		}
          	}
          }
          mfG Gü
          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

          Comment


          • #6
            hi,

            danke für deine Hilfe, komme leider mit deinem code nicht zurecht

            schau grad in die richtung:

            Code:
            Imports System.Net
            Imports System.Net.Security
            Imports System.Security.Cryptography.X509Certificates
            
            Public Class Class1
            
                Private Function ValidateCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
                    'Return True to force the certificate to be accepted.
                    Return True
                End Function
            
                Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
                    ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateCertificate)
                End Sub
            
            End Class
            Zuletzt editiert von Tux; 21.09.2008, 22:57.

            Comment


            • #7
              Soooooooooooooooooooo,

              ich habe es nun hinbekommen das er erfolgreich den POST macht nun bekomm ich es leider noch nicht hin die XML Antwort in meine Windows Forms anwendung zu packen, hat da jemand ne idee für mich

              Am besten wäre es, wenn die XML Antwort der PHP Datei gleich in lokale variablen abgefangen würde z.B. antwort ist:

              <username>hans</username>
              <userid>1337</userid>

              das er dann lokal username as string = hans und userid as integer = 1337 hat

              Comment


              • #8
                bin schon einen schritt, weiter, das ergebnis des requests wird lokal erstmal in eine xml datei gespeichert, nun muss ich nurnoch diese auslesen und in varablen laden, mein code mal hier:

                Code:
                Try
                            ' Antwort empfangen
                            response = DirectCast(request.GetResponse(), HttpWebResponse)
                
                            Dim xmlLeser As XmlTextReader
                            Dim myXMLDoc As New XmlDocument
                
                            ' Antwort in den XML Leser packen
                            xmlLeser = New XmlTextReader(response.GetResponseStream())
                
                            myXMLDoc.Load(xmlLeser)
                            myXMLDoc.Save("C:\\temp\\daten.xml")
                
                        Finally
                            If Not response Is Nothing Then response.Close()
                        End Try

                Comment


                • #9
                  Hallo Tux,

                  1) Es wäre interessant wie du hinbekommen hast (bitte poste deinen Code)

                  2) Die Antwort bekommst du als XML-String. D.h. du könntest den Umweg über die Datei sparen und so vorgehen (LINQ to XML wird verwendet - Framework 3.5):
                  [highlight=vb.net]
                  Imports System.Xml.Linq

                  Namespace ConsoleApplication1
                  Class Program
                  Private Shared Sub Main(args As String())
                  Dim xmlString As String = "<antwort>" + "<user>testuser</user>" + "<gewicht>59</gewicht>" + "<alter>22</alter>" + "<klasse>5</klasse>" + "</antwort>"

                  Dim xml As XElement = XElement.Parse(xmlString)
                  Dim user As String = DirectCast(xml.Element("user"), String)
                  Dim gewicht As Integer = CInt(xml.Element("gewicht"))
                  Dim alter As Integer = CInt(xml.Element("alter"))
                  Dim klasse As Integer = CInt(xml.Element("klasse"))
                  End Sub
                  End Class
                  End Namespace
                  [/highlight]

                  mfG Gü
                  Zuletzt editiert von gfoidl; 28.09.2008, 19:09. Reason: Framework-Version hinzugefügt
                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                  Comment


                  • #10
                    Du sagst Framework 3.5 d.h. wenn ich mein Programm jemanden gebe der kein Framework 3.5 hat sondern nur 2.0 kann dieser mit meinem Programm nicht arbeiten, oder?

                    Code poste ich wenn ich daheim bin

                    Comment


                    • #11
                      Korrekt.

                      Bei der Installtion muss dann das Update auf Framework 3.5 hinzugefügt werden (bei ClickOnce gehts glaube ich automatisch).

                      Oder die extrahierst die Werte aus dem XML-String über XmlDocument (also nicht über XLINQ).

                      mfG Gü
                      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                      Comment


                      • #12
                        Form1.vb
                        [highlight=vb.net]
                        Imports System.Net
                        Imports System.Net.Security
                        Imports System.Security.Cryptography.X509Certificates

                        Public Class Form1

                        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

                        Dim username As String
                        username = TextBox1.Text
                        Anmeldung.Anmelden(username)

                        End Sub

                        Private Function ValidateCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
                        'Return True um doofe Zertifikate zu schlucken
                        Return True
                        End Function

                        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
                        ServicePointManager.ServerCertificateValidationCal lback = New RemoteCertificateValidationCallback(AddressOf ValidateCertificate)
                        End Sub
                        End Class
                        [/highlight]

                        Anmeldung.vb
                        [highlight=vb.net]

                        Imports System.Web
                        Imports System.Net
                        Imports System.Net.Security
                        Imports System.IO
                        Imports System.Text
                        Imports System.Security.Cryptography.X509Certificates
                        Imports System.Xml

                        Public Class Anmeldung

                        Public Shared Sub Anmelden(ByVal username As String)

                        ' Zugriff auf SSL-Seite:
                        Dim request As HttpWebRequest
                        Dim response As HttpWebResponse = Nothing
                        Dim reader As StreamReader
                        Dim address As Uri
                        Dim query As String
                        Dim nochwas As String
                        Dim data As StringBuilder
                        Dim byteData() As Byte
                        Dim postStream As Stream = Nothing

                        address = New Uri("https://localhost/php/apis/anmeldung.php")

                        request = DirectCast(WebRequest.Create(address), HttpWebRequest)
                        request.Method = "POST"
                        request.ContentType = "application/x-www-form-urlencoded"
                        query = username
                        nochwas = "SESAM_OEFFNE_DICH"

                        Dim values As New Collection
                        values.Add(username)

                        data = New StringBuilder()
                        data.Append("action=" + HttpUtility.UrlEncode(nochwas))
                        data.Append("&username=" + HttpUtility.UrlEncode(query))

                        ' Byte array erstellen (mit Sendedaten)
                        byteData = UTF8Encoding.UTF8.GetBytes(data.ToString())

                        ' Länge setzen
                        request.ContentLength = byteData.Length

                        ' Daten schreiben
                        Try
                        postStream = request.GetRequestStream()
                        postStream.Write(byteData, 0, byteData.Length)

                        Finally
                        If Not postStream Is Nothing Then postStream.Close()
                        End Try

                        Try
                        ' Empfange die Antwort
                        response = DirectCast(request.GetResponse(), HttpWebResponse)

                        Dim xmlLeser As XmlTextReader
                        Dim myXMLDoc As New XmlDocument

                        ' Pack die Antwort in einen Reader
                        xmlLeser = New XmlTextReader(response.GetResponseStream())
                        reader = New StreamReader(response.GetResponseStream())

                        myXMLDoc.Load(xmlLeser)
                        myXMLDoc.Save("C:\\test\\daten.xml")

                        ' Console application output (is aber wayne eigtl.)
                        Console.WriteLine(reader.ReadToEnd())

                        Finally
                        If Not response Is Nothing Then response.Close()
                        End Try

                        End Sub
                        End Class

                        [/highlight]
                        Zuletzt editiert von Tux; 29.09.2008, 18:50.

                        Comment


                        • #13
                          Danke!

                          mfG Gü
                          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                          Comment

                          Working...
                          X