TcpListener 句柄 POST 响应变量

TcpListener handle POST Response variables

我们有一个基本的打印客户端,它使用 Ajax 侦听从 Web 发送的连接。发送了几个变量,例如 Jquery 请求上下文:

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

这被视为

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

我需要最终得到"labelType"、"shipmentNumber"等等(注意,labelType/END是我如下图搜索的字符串,不是我想要的数据的一部分), out 作为要使用的变量,我不确定执行此操作的最佳方法。目前我有(简化):

        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

如您所见,我在响应中搜索 "markers" 或我在其中输入的分隔符;感觉会不靠谱,应该有更好的办法。我有 seen some questions related but they don't directly address this,我不确定这些是否正确。这可能已经是最好的方法,但不问我不知道。

您会使用什么方法来做到这一点?

有没有更好的方法?

使用shipmentNumber=作为关键字找到参数的开始。然后使用 & 分隔符拆分它。然后循环使用 = 分隔符将它们分成 parameters/values。

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