2017-06-28 1 views
0

Wir haben einen grundlegenden Druckclient, der Verbindungen überwacht, die mit Ajax aus dem Internet gesendet werden. Es gibt mehrere vairables geschickt, zB JQuery Anfrage Kontext:TcpListener handle POST Antwortvariablen

$.ajax({ 
      url : 'http://127.0.0.1:13000', 
      type : 'POST', 
      data : { 
      'shipmentNumber': 'SAMPLESN998SSkLAIS', 
      'labelType': 'labelTypePostageEND', 
      'pdfLabel': 'pdfLabel__' 
     } 

Dies als

gesehen wird

POST/HTTP/1.1 Host: 127.0.0.1:13000 Verbindung: Keep-Alive- Content- Länge: 70621 Akzeptiert: / Herkunft: null Benutzer-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, wie Gecko) Chrome/59.0.3071.109 Safari/537.36 Content-Type: Anwendung/x-www-form-urlencoded; charset = UTF-8-Accept-Encoding: gzip, abzulassen, br Accept-Language: en-GB, en-US; q = 0,8, en; q = 0,6 shipmentNumber = SAMPLESN998SSkLAIS & labelType = labelTypeRoyalMailEND & pdfLabel =

Ich muss schließlich "labelType", "sendungsnummer" und mehr (beachten Sie, labelType/END ist die Zeichenfolge, die ich suche wie folgt, nicht Teil der Daten, die ich will), als Variablen zu verwenden, und ich bin nicht sicher, der beste Weg, dies zu tun. Zur Zeit habe ich (vereinfacht):

 Dim port As Int32 = 13000 
     Dim localAddr As IPAddress = IPAddress.Parse("127.0.0.1") 

     server = New TcpListener(localAddr, port) 

     ' Start listening for client requests. 
     server.Start() 

     ' Buffer for reading data 
     Dim bytes(10240000) As Byte 
     Dim data As String = Nothing 

     ' Enter the listening loop. 
     While True 

      Dim client As TcpClient = server.AcceptTcpClient() 

      data = Nothing 

      ' Get a stream object for reading and writing 
      Dim stream As NetworkStream = client.GetStream() 

      Dim i As Int32 

      ' Loop to receive all the data sent by the client. 
      i = stream.Read(bytes, 0, bytes.Length) 
      data = System.Text.Encoding.ASCII.GetString(bytes, 0, 5000) 

      ' >>>> The bit that matters, split the data based on what we know will be there 
      Dim searchIndex As Integer = data.IndexOf("labelType") 
      Dim f As String = data.Substring(searchIndex + 1, data.IndexOf("END", searchIndex + 1) - searchIndex - 1) 

      MessageBox.Show(data) 

      ' >>> Response and Close connection removed to keep question clean 
     End While 

Wie Sie kann ich ich die Antwort für „Marker“ oder Begrenzer ich dort setzen suchen sehen; es fühlt sich an, als wäre es unzuverlässig und es sollte einen besseren Weg geben. Ich habe seen some questions bezogen, aber sie nicht directly address this, und ich bin mir nicht sicher, ob diese sogar richtig sind. Das mag schon der beste Weg sein, aber ohne zu fragen, weiß ich es nicht.

Welche Methode würden Sie verwenden, um dies zu tun?

Gibt es einen besseren Weg?

Antwort

1

Den Anfang der Parameter finden Sie unter shipmentNumber= als Schlüssel. Dann teilen Sie das mit dem & Trennzeichen. Dann durchschleifen Sie sie jeweils in Parameter/Werte unter Verwendung des = Trennzeichens.

data = System.Text.Encoding.ASCII.GetString(bytes, 0, 5000) 

Dim dataStart As String = "shipmentNumber=" 

If data.Contains(dataStart) Then 
    data = data.Substring(data.IndexOf(dataStart)).Trim 
    Dim _params() As String = Split(data, "&") 
    For Each p In _params 
     Dim _values() As String = Split(p, "=") 
     If _values.Length > 0 Then 
      Dim _parameter As String = _values(0) 
      Dim _value As String = "" 
      If _values.Length > 1 Then 
       _value = _values(1) 
      End If 
      Debug.Print("parameter = " & _parameter) 
      Debug.Print("value = " & _value) 
     End If 
    Next 
End If