通过WebRequest下载带有JSON响应作为重定向的文件



我正在努力寻找通过WebRequest加载文件的方法
API非常容易。例如,我有以下地址:
https://eprel.ec.europa.eu/api/products/tyres/381324/labels?format=PDF
在这种情况下,浏览器中会显示一个标签。

有了/labels,我可以下载一个zip包
对于/labels?noDirect=true&format=PDF,响应将是一个200 OK,其内容包含资源的URL({address:label or fiche URL}(。

代码:

Dim request As WebRequest = WebRequest.Create("https://eprel.ec.europa.eu/api/products/tyres/381324/labels?noRedirect=true&format=PDF")
request.Credentials = CredentialCache.DefaultCredentials
Dim response As WebResponse = request.GetResponse()
Console.WriteLine(CType(response, HttpWebResponse).StatusDescription)
Console.WriteLine(response)
Using dataStream As Stream = response.GetResponseStream()
Dim reader As New StreamReader(dataStream)
Dim responsefromServer As String = reader.ReadToEnd()
Console.WriteLine(responsefromServer)
End Using

我得到了OK的响应,但没有下载标签的URL
此外,如果我只使用/labels?format=PDF,我就无法保护显示的PDF。

我也试过硒,但这个解决方案有点慢。所以我更喜欢使用WebRequest。

也许有人可以帮忙。

API有一个双向响应,基于请求的URI:

  • 如果您的URI是一个查询,如
    https://eprel.ec.europa.eu/api/products/tyres/381324/labels?format=PDF
    响应是一个JSON,它指定了一个替换查询的URL片段,以便为直接资源构建一个新的URI。但是它也将WebResponse.ResourceUri地址更改为这个确切的位置。不要使用?noDirect=true选项
  • 如果将直接地址指定为https://eprel.ec.europa.eu/label/Label_381324.pdf
    ResponseStream将包含要下载的数据

注意:这是一个二进制文件,不能使用StreamReader读取二进制数据。


这里有两种方法可以将PDF文件下载为字节数组
GetPDFResourceAsync()采用查询形式的Uri,获取响应,然后调用第二个方法GetPDFResourceDirectAsync(),传递从服务器接收的WebResponse.ResourceUri

如果你想给我们查询URI,请调用GetPDFResourceAsync(),如果你想使用直接资源URI,只需调用GetPDFResourceDirectAsync()

InitializeWebRequest()方法是一个用于初始化HttpWebRequest的实用程序方法。如果没有它,GetPDFResourceAsync()将不起作用,因为服务器需要一个User-Agent头集和一个Compression方法(否则会得到垃圾(。

现在,这些方法返回一个字节数组(PDF文件数据(
您可以使用"文件"将其存储到光盘中。WriteAllBytes((方法。例如:

' Indirect method, using a URI query
Dim pdfBytes = Await GetPDFResourceAsync(New Uri("https://eprel.ec.europa.eu/api/products/tyres/381324/labels?format=PDF"))
' Direct method, using a resource URI
Dim pdfBytes = Await GetPDFResourceDirectAsync(New Uri("https://eprel.ec.europa.eu/label/Label_381324.pdf"))
Dim pdfFilePath = Path.Combine("[Some Directory]", "Label381324.pdf")
File.WriteAllBytes(pdfFilePath, pdfBytes)

辅助方法
如果您不想/不能使用async方法,只需从各处删除asyncawait(包括方法名称(,您就可以获得同步代码。

Public Async Function GetPDFResourceAsync(resourceUri As Uri) As Task(Of Byte())
Dim request = WebRequest.CreateHttp(resourceUri)
InitializeWebRequest(request)
Using locResponse As HttpWebResponse = DirectCast(Await request.GetResponseAsync(), HttpWebResponse)
If locResponse.StatusCode = HttpStatusCode.OK Then
Return Await GetPDFResourceDirect(locResponse.ResponseUri)
Else
Return Nothing
End If
End Using
End Function
Public Async Function GetPDFResourceDirectAsync(resourceUri As Uri) As Task(Of Byte())
Dim request = WebRequest.CreateHttp(resourceUri)
InitializeWebRequest(request)
Dim buffersize As Integer = 132072
Dim buffer As Byte() = New Byte(buffersize - 1) {}
Dim dataResponse = DirectCast(Await request.GetResponseAsync(), HttpWebResponse)
If dataResponse.StatusCode = HttpStatusCode.OK Then
Using responseStream As Stream = dataResponse.GetResponseStream(),
mStream As MemoryStream = New MemoryStream()
Dim read As Integer = 0
Do
read = Await responseStream.ReadAsync(buffer, 0, buffer.Length)
Await mStream.WriteAsync(buffer, 0, read)
Loop While read > 0
Return mStream.ToArray()
End Using
End If
Return Nothing 
End Function
Private Sub InitializeWebRequest(request As HttpWebRequest)
request.UserAgent = "Mozilla/5.0 (Windows NT 10; WOW64; Trident/7.0; rv:11.0) like Gecko"
request.AutomaticDecompression = DecompressionMethods.GZip Or DecompressionMethods.Deflate
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate;q=0.8")
request.Headers.Add(HttpRequestHeader.CacheControl, "no-cache")
End Sub

相关内容

  • 没有找到相关文章

最新更新