2017-06-28 5 views
0

Nous avons un client d'impression de base, qui écoute les connexions envoyées à partir du Web en utilisant Ajax. Il y a plusieurs vairables envoyés sur demande, par exemple Jquery pour le contexte:TcpListener gérer les variables de réponse POST

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

Ceci est considéré comme

POST/HTTP/1.1 Host: 127.0.0.1:13000 Connection: keep-alive Content- Longueur: 70621 Accepter: / Origine: null Utilisateur-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, comme Gecko) Chrome/59.0.3071.109 Safari/537.36 Type de contenu: application/x-www-form-urlencoded; charset = UTF-8 Accept-Encoding: gzip, deflate, br Accept-Language: fr-FR, fr-fr; q = 0.8, en; q = 0.6 shipmentNumber = SAMPLESN998SSkLAIS & labelType = labelTypeRoyalMailEND & pdfLabel =

J'ai besoin d'obtenir "labelType", "shipmentNumber" et plus (note, labelType/END est la chaîne que je recherche comme ci-dessous, ne fait pas partie des données que je veux), comme variables à utiliser et je suis pas sûr de la meilleure façon de le faire. Actuellement, j'ai (simplifié):

 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 

Comme vous pouvez le voir, je je cherche la réponse pour « marqueurs » ou délimiteurs je mets là-dedans; il semble que ce ne sera pas fiable et il devrait y avoir un meilleur moyen. J'ai seen some questions liés, mais ils ne sont pas directly address this, et je ne suis pas sûr si ceux-ci sont même raison. C'est peut-être déjà le meilleur moyen, mais sans demander je ne sais pas.

Quelle méthodologie utiliseriez-vous pour faire cela?

Y a-t-il un meilleur moyen?

Répondre

1

Trouvez le début des paramètres en utilisant shipmentNumber= comme clé. Puis divisez-le en utilisant le délimiteur &. Faites ensuite une boucle à travers chaque division en paramètres/valeurs en utilisant le délimiteur =.

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