2017-04-15 38 views
-1

我需要帮助。 我的身体在编译之前可以很好地处理数据。HttpWebRequest - 如何动态设置变量到本体中

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""]}]}" 

请参阅完整的代码如下

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 
 
\t 
 
    ''' <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> 
 
\t 
 
    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

+0

_“这行不通”_是一个非常模糊的问题描述。什么/没有发生?通过调用默认实例('Form3.Show()')打开'Form3',还是使用'New Form3'打开并调用'.Show()'? –

+0

From3.txtbx_title.Text只包含一个字符串。 Form3是主窗体。我也试过下面的Dim txtbx As String =“CISCO高级网络工程师”Dim body As String =“{”“travelForm”“:[{”“title”“”“”“IT Unix 4”“,”&txtbx&“ :“”

Hello fjdsbfjsdhfkjn,vxnc bx vxnodjosidfjlkj kjk sds iufsyiufshkjdjxfoksjdkjhkjshdfsd

“”,“”phone“”:“”0199654128“”,“”categoryfont“”:7459250,“”categoryClass“”:“”Toyota“”“,” “DataCategory” “:100”, “其中” “:{” “纬度”, “: - 33.8659683”, “经度” “:18.534443499999952”, “半径” “:5000}”, “categoryAttributes” “:[],” “imageWeb”“:[”“c:\ mypict100.JPG?set_id = 8800005007”“]}]}” –

+0

'Form3.txtbx_title.Text' **只能包含一个字符串!他问_ **它包含的是什么(它的价值是什么),而不是它包含的是什么类型。 - 再次,请定义_“它不起作用”_。 –

回答

1

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

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

是无效的JSON,而

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

是有效的JSON。

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

措施编号:请注意,简单地使用双引号将Form3.txtbx_title.Text环绕是不够的。您需要确保如果用户输入包含一个或多个双引号的文本,则每个文本必须通过以\字符作为前缀加以转义。

+0

感谢您的评论。我真的知道我必须为字符串加双引号。但我担心的是我必须动态加载数据。所以我必须像下面这样使用变量:'Dim myVariable As String =“CISCO Senior Network Engineer”Dim body As String =“{”“travelForm”“:[{”“title”“:”&myVariable&“, “”description“”:“”

Hello fjdsbfj iufsfsd

“”,“”phone“”:“”01 8“”,“catfont”“:7459250”,“categoryC lass”“:”“丰田 “”, “” DataCat “”:100 “ ”其中“”:{ “” 纬度 “”:-33.8 “” LON GIT中 “”:18.5 “” 半径 “”:5 0},“”categoryAttri“”:[],“”imageWeb“”:[“”c:\ mypict10.JPG?set_id = 88“”]]]}“ ' –

+0

'”... “+ myVariable +”...“'=>'”...“”“+ myVariable.Replace(”“”“”,“”“”)+“”“...”' – stakx

+0

谢谢你SOOOOOO MUCHHHHHHH先生stakx!我使用第二个作为我的变量是一个字符串,所以它需要包含任何字符,包括引号和任何工作正常。无论我使用第二个,我不需要关心用户输入了吗?或者某些字符不应该由用户输入?我感谢你的帮助先生。 –