HttpWebRequest - 如何动态地将变量设置到此主体中

时间:2017-04-15 14:46:33

标签: .net vb.net

我需要帮助。 在编译之前,我的身体可以很好地处理数据。

Dim body As String = "{""travelForm"":[{""title"":""IT Unix 4"",""description"":""<p>Hello fjdsbfjsdhfkjn,vxnc bx vxnodjosidfjlkj kjk sds iufsyiufshkjdjxfoksjdkjfsiodhfsdhfsudhfskjdlfksjlfsjdkfhkjhjk hj hdkjfhksjdhfjkh kjh skjdhfkjsdhfkj hkjsdhfskjdskh jhsjdhfkjshdfjsdhkjfsdhkhsdkjsdhskjhfskjdhjshjdhfskjhskdhfkjdhfj hkjshdfsd</p>"",""phone"":""0199654128"",""categoryfont"":7459250,""categoryClass"":""Toyota"",""DataCategory"":100,""where"":{""latitude"":-33.8659683,""longitude"":18.534443499999952,""radius"":5000},""categoryAttributes"":[],""imageWeb"":[""c:\mypict100.JPG?set_id=8800005007""]}]}"

但是当我尝试设置变量dinamycally(Form3.txtbx_title.Text)时,它不起作用。

Dim body As String = "{""travelForm"":[{""title"":"&Form3.txtbx_title.Text&",""description"":""<p>Hello fjdsbfjsdhfkjn,vxnc bx vxnodjosidfjlkj kjk sds iufsyiufshkjdjxfoksjdkjfsiodhfsdhfsudhfskjdlfksjlfsjdkfhkjhjk hj hdkjfhksjdhfjkh kjh skjdhfkjsdhfkj hkjsdhfskjdskh jhsjdhfkjshdfjsdhkjfsdhkhsdkjsdhskjhfskjdhjshjdhfskjhskdhfkjdhfj hkjshdfsd</p>"",""phone"":""0199654128"",""categoryfont"":7459250,""categoryClass"":""Toyota"",""DataCategory"":100,""where"":{""latitude"":-33.8659683,""longitude"":18.534443499999952,""radius"":5000},""categoryAttributes"":[],""imageWeb"":[""c:\mypict100.JPG?set_id=8800005007""]}]}"

请参阅下面的完整代码

&#13;
&#13;
Imports System.Net
Imports System.Text
Imports System.IO
Imports System.Diagnostics
Imports System.IO.Compression

Imports System.Net.WebUtility


Module PostTravelForm

    Public logincookiePost As CookieContainer
    Dim logincookstring As String

    Dim theWantedString As String

    'Calls request functions sequentially.
    Sub MakeRequests3()
        Dim response As HttpWebResponse
        Dim responseText As String

        If Request_www_germany_com(response) Then
            'Success, possibly use response.
            responseText = ReadResponse(response)

            response.Close()
        Else
            'Failure, cannot use response.
        End If
    End Sub

    'Returns the text contained in the response.  For example, the page HTML.  Only handles the most common HTTP encodings.
    Public Function ReadResponse(response As HttpWebResponse) As String
        Using responseStream = response.GetResponseStream()
            Dim streamToRead As Stream = responseStream
            If response.ContentEncoding.ToLower().Contains("gzip") Then
                streamToRead = New GZipStream(streamToRead, CompressionMode.Decompress)
            ElseIf response.ContentEncoding.ToLower().Contains("deflate") Then
                streamToRead = New DeflateStream(streamToRead, CompressionMode.Decompress)
            End If

            Using streamReader = New StreamReader(streamToRead, Encoding.UTF8)
                Return streamReader.ReadToEnd()
            End Using
        End Using
    End Function
	
    ''' <summary>
    ''' Tries to request the URL: https://www.travel.com/postad/create
    ''' </summary>
    ''' <param name="response">After the function has finished, will possibly contain the response to the request.</param>
    ''' <returns>True if the request was successful; false otherwise.</returns>
	
    Private Function Request_www_germany_com(ByRef response As HttpWebResponse) As Boolean
        response = Nothing

        Try
            'Create request to URL.
            Dim request As HttpWebRequest = DirectCast(WebRequest.Create("https://www.travel.com/api/postad/create"), HttpWebRequest)
            Dim tempCookies As New CookieContainer

            'Set request headers.
            request.KeepAlive = True
            request.Accept = "application/json, text/javascript, */*; q=0.01"
            request.Headers.Add("Origin", "https://www.travel.com")
            request.Headers.Add("x-requested-with", "XMLHttpRequest")
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"

            request.CookieContainer = logincookiePost

            request.ContentType = "application/json"
            request.Referer = "https://www.travel.com/post"
            request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br")
            request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.8")

            'Set request method
            request.Method = "POST"

            ' Disable 'Expect: 100-continue' behavior. More info: http://haacked.com/archive/2004/05/15/http-web-request-expect-100-continue.aspx
            request.ServicePoint.Expect100Continue = False

            Console.WriteLine(Form3.txtbx_title.Text & " Test !!!!!!!!!!!!")

            Dim txtbx As String = "<p>CISCO Senior Network Engineer</p>"

            'Set request body.
           
            Dim body As String = "{""ads"":[{""title"":""…" + txtbx + "…"",""description"":""<p>" + Form3.txtbx_descript.Text.Replace("""", "\""") + "</p>"",""phone"":""0799654128"",""categoryId"":9250,""categoryName"":""Computer Operators"",""parentCategory"":8,""location"":{""latitude"":-33.8659683,""longitude"":18.534443499999952,""radius"":2000},""categoryAttributes"":[],""imageUrls"":[""https://i.ebayimg.com/00/s/NjAwWDgwMA==/z/~qIAAOSwU8hY75kG/$_1.PNG?set_id=8800005007""]}]}"


            Dim postBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(body)
            request.ContentLength = postBytes.Length
            Dim stream As Stream = request.GetRequestStream()
            stream.Write(postBytes, 0, postBytes.Length)
            stream.Close()

            'Get response to request.
            response = DirectCast(request.GetResponse(), HttpWebResponse)
        Catch e As WebException
            'ProtocolError indicates a valid HTTP response, but with a non-200 status code (e.g. 304 Not Modified, 404 Not Found)
            If e.Status = WebExceptionStatus.ProtocolError Then
                response = DirectCast(e.Response, HttpWebResponse)
            Else
                Return False
            End If
        Catch e As Exception
            If response IsNot Nothing Then
                response.Close()
            End If
            Return False
        End Try

        Return True
    End Function

End Module
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

如果您研究JSON syntax,您会发现所有对象键必须是字符串。这意味着,必须在双引号(")中正确引用键。因此,

{ CISCO Senior Network Engineer: "<p>Hello…</p>" }

是无效的JSON,而

{ "CISCO Senior Network Engineer": "<p>Hello…</p>" }

是有效的JSON。

您的问题似乎是您没有引用密钥。

P.S。:请注意,用双引号简单地包围Form3.txtbx_title.Text是不够的。您需要确保如果用户输入包含一个或多个双引号的文本,则必须通过在其前面添加\字符来对其中的每一个进行转义。