分两步获取信息和内容
HttpClient有个GetInformation方法,用于获取内容信息,获取成功则返回True,否则返回False。
此方法执行之后并不会关闭和服务端的连接,我们可以继续用GetFile、GetData等方法获取内容本身。
有了这个方法,我们可以首先获取内容信息,然后根据内容信息进行下一步的操作,而无需重新连接服务器。
示例一
服务端的HttpRequest事件代码为:
Select
Case e.Path
Case
"test.jpg"
If
Date.Now.Hour
< 10 Then
e.ResponseHeaders("Error")
= "001"
e.WriteString("文件还未准备好,请10点之后再下载!")
Else
e.WriteFile("d:\web\test.jpg")
End If
End
Select
如果客户在上午10点之前访问,则在头部信息中加上错误标记,并返回文本形式的错误信息。
客户端代码:
Dim
htc As
new HttpClient("http://127.0.0.1/test.jpg")
If
htc.GetInformation()
Then
Dim err
As String =
htc.ResponseHeaders("Error")
If err>
"" Then
MessageBox.Show(htc.GetData()
,"错误",
MessageBoxButtons.OK,
MessageBoxIcon.Error)
Else
htc.GetFile("c:\data\test.jpg")
MessageBox.Show("文件下载成功",
"提示",
MessageBoxButtons.OK,
MessageBoxIcon.Information)
End
If
Else
MessageBox.Show("文件下载失败",
"提示",
MessageBoxButtons.OK,MessageBoxIcon.Error)
End
If
示例二
服务端可以只发送内容信息,而不发送内容,例如服务端的HttpRequest事件代码为:
Select
Case e.Path
Case "test.jpg"
If
Date.Now.Hour
< 10 Then
e.ResponseHeaders("Error")
= "The file is not ready"
e.Handled
= True
Else
e.WriteFile("d:\web\test.jpg")
End
If
End Select
如果客户在上午10点之前访问,则通过头部信息返回错误"The
file is not ready!"
重要提示:
1、如果不打算发送内容本身,只发送内容信息,那么务必将e参数Handled设置为True,否则客户端将持续等待,直到超时。
2、头部信息不支持中文,解决方法后面会介绍。
客户端代码:
Dim
htc As
new HttpClient("http://127.0.0.1/test.jpg")
If
htc.GetInformation()
Then
Dim err
As String =
htc.ResponseHeaders("Error")
If err>
"" Then
MessageBox.Show(err,"错误",
MessageBoxButtons.OK,
MessageBoxIcon.Error)
Else
htc.GetFile("c:\data\test.jpg")
MessageBox.Show("文件下载成功",
"提示",
MessageBoxButtons.OK,
MessageBoxIcon.Information)
End
If
Else
MessageBox.Show("文件下载失败",
"提示",
MessageBoxButtons.OK,MessageBoxIcon.Error)
End
If
第三方开发接口示例
有了GetInformation方法,我们进行第三方接口开发的时候,会更加方便,还是以上一节企业微信下载临时素材为例,改进后的代码为:
Dim
ul As
String =
"https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}"
Dim
mediaID As
String =
"1GDEyyL7RIo868rKmIf3ThZoCMkd69VvH3wPBMpQj9w3uq7dmdxlbNjh669KPLyhF7EEOpBszls7BSmgMFgn07A"
'要获取素材的ID
Dim
hc As
new HttpClient(CExp(ul,Functions.Execute("GetQYAccessToken"),mediaID))
Dim
fl As
String =
"c:\data\abc.jpg" '要保存为的本地文件
If
hc.GetInformation()
Then
If hc.ResponseContentType.StartsWith("application/json")
Then
MessageBox.Show(hc.GetData())
Else
hc.GetFile(fl)
MessageBox.Show("图片素材下载成功!")
End
If
Else
MessageBox.Show("图片素材下载失败!")
End
If