Vb.net 按顺序相互依赖的多个httprequest
我正在将一个VBScript转换为VB.Net,我在处理web请求时挂断了 我已经读到我不需要MSXML2.XMLHTTP对象,但在VB.Net中执行webrequest似乎要复杂得多 VBScript源(未给出实际URL和post字符串): 这样就可以工作了,并返回一个漂亮的JSON字符串和结果。需要注意的几点:Vb.net 按顺序相互依赖的多个httprequest,vb.net,vbscript,Vb.net,Vbscript,我正在将一个VBScript转换为VB.Net,我在处理web请求时挂断了 我已经读到我不需要MSXML2.XMLHTTP对象,但在VB.Net中执行webrequest似乎要复杂得多 VBScript源(未给出实际URL和post字符串): 这样就可以工作了,并返回一个漂亮的JSON字符串和结果。需要注意的几点: 第一个请求“让您登录”。不知道这是怎么回事,只是在Fiddler中注意到,当你访问这个站点时,它会将你重定向到那个URL,然后你跳回去。它与我的公司单一登录有某种联系。但是,没有它
- 第一个请求“让您登录”。不知道这是怎么回事,只是在Fiddler中注意到,当你访问这个站点时,它会将你重定向到那个URL,然后你跳回去。它与我的公司单一登录有某种联系。但是,没有它脚本就无法工作
- 第二个请求实际上运行搜索
- 第三个请求以JSON字符串的形式从不同的URL提取结果,这正是我最终想要的
- 实际的“站点”由几个框架组成。一个框架是构建第二个请求的webform。另一个框架使用来自第三个请求的JSON以良好的格式拉/显示结果
Dim objWebClient As New WebClient()
objWebClient.DownloadString(sLoginUrl)
objWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded")
objWebClient.UploadString(sResultsURL, "POST", sFormData)
objWebClient.DownloadString(sResultsHandlerURL)
我在我的帖子上得到了克劳科德的建议。我在帖子中的链接中修改了该函数,如下所示:
Function WRequest(URL As String, method As String, POSTdata As String, ByRef cookieJar As CookieContainer) As String
Dim responseData As String = ""
Try
Dim hwrequest As Net.HttpWebRequest = Net.WebRequest.Create(URL)
hwrequest.CookieContainer = cookieJar
hwrequest.Accept = "*/*"
hwrequest.AllowAutoRedirect = True
hwrequest.UserAgent = "http_requester/0.1"
hwrequest.Timeout = 60000
hwrequest.Method = method
If hwrequest.Method = "POST" Then
hwrequest.ContentType = "application/x-www-form-urlencoded"
Dim encoding As New ASCIIEncoding() 'Use UTF8Encoding for XML requests
Dim postByteArray() As Byte = encoding.GetBytes(POSTdata)
hwrequest.ContentLength = postByteArray.Length
Dim postStream As IO.Stream = hwrequest.GetRequestStream()
postStream.Write(postByteArray, 0, postByteArray.Length)
postStream.Close()
End If
Dim hwresponse As Net.HttpWebResponse = hwrequest.GetResponse()
If hwresponse.StatusCode = Net.HttpStatusCode.OK Then
Dim responseStream As IO.StreamReader = _
New IO.StreamReader(hwresponse.GetResponseStream())
responseData = responseStream.ReadToEnd()
End If
hwresponse.Close()
Catch e As Exception
responseData = "An error occurred: " & e.Message
End Try
Return responseData
End Function
Dim cookieJar As New CookieContainer
WRequest(sLoginURL, "GET", "", cookieJar)
WRequest(sResultsURL, "POST", postString, cookieJar)
Debug.Print(WRequest(sResultsHandlerURL, "GET", "", cookieJar))
然后称之为:
Function WRequest(URL As String, method As String, POSTdata As String, ByRef cookieJar As CookieContainer) As String
Dim responseData As String = ""
Try
Dim hwrequest As Net.HttpWebRequest = Net.WebRequest.Create(URL)
hwrequest.CookieContainer = cookieJar
hwrequest.Accept = "*/*"
hwrequest.AllowAutoRedirect = True
hwrequest.UserAgent = "http_requester/0.1"
hwrequest.Timeout = 60000
hwrequest.Method = method
If hwrequest.Method = "POST" Then
hwrequest.ContentType = "application/x-www-form-urlencoded"
Dim encoding As New ASCIIEncoding() 'Use UTF8Encoding for XML requests
Dim postByteArray() As Byte = encoding.GetBytes(POSTdata)
hwrequest.ContentLength = postByteArray.Length
Dim postStream As IO.Stream = hwrequest.GetRequestStream()
postStream.Write(postByteArray, 0, postByteArray.Length)
postStream.Close()
End If
Dim hwresponse As Net.HttpWebResponse = hwrequest.GetResponse()
If hwresponse.StatusCode = Net.HttpStatusCode.OK Then
Dim responseStream As IO.StreamReader = _
New IO.StreamReader(hwresponse.GetResponseStream())
responseData = responseStream.ReadToEnd()
End If
hwresponse.Close()
Catch e As Exception
responseData = "An error occurred: " & e.Message
End Try
Return responseData
End Function
Dim cookieJar As New CookieContainer
WRequest(sLoginURL, "GET", "", cookieJar)
WRequest(sResultsURL, "POST", postString, cookieJar)
Debug.Print(WRequest(sResultsHandlerURL, "GET", "", cookieJar))
比VBS更复杂,哈哈,但它能工作 您需要在第一个请求上设置CookieContainer,然后在发出第二个请求时使用CookieContainer的相同实例。是一个用C#演示类似事情的示例。很抱歉格式化,它并没有完全从我以前的博客中完整地出现。这就成功了,修改了我链接中的函数,向ByRef传递了一个cookie容器,它成功了。在下面发布最终解决方案。谢谢不走运。看起来应该行得通,但不行。一定是关于饼干的处理方法。我从上面听从了克劳科德的建议,结果成功了。在下面发布了完整的解决方案。