嘗試使用此服務獲取 JSON 資料以在本地進行進一步處理:
https://www.sec.gov/edgar/sec-api-documentation
測驗示例(來自上面的檔案鏈接):
https://data.sec.gov/api/xbrl/frames/us-gaap/AccountsPayableCurrent/USD/CY2019Q1I.json
在瀏覽器中效果很好,但是我嘗試了幾種方法(如下所列)都失敗了,主要是協議錯誤 / 404
根據檔案 https://www.sec.gov/os/webmaster-faq#developers
我已經合并了所需的標題條目(我認為正確)
我一直讀到首選方法是使用 HttpClient,但是我遇到的所有簡單示例都是 C# 和/或使用我不理解的 lambda 運算式。我試圖盡可能地翻譯成 VB - 不確定我是否做對了。
我也在 App.config 中添加了這個:
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing = "true"/>
</settings>
</system.net>
該應用程式是框架 4.7.2 上的 Win Forms 應用程式,作業系統是 Windows 10 Pro、20H2、64 位作業系統、基于 x64 的處理器
Imports System.IO
Imports System.Net
Imports System.Net.Http
Public Module SECJSON
Public sourceUrl As String = "https://data.sec.gov/api/xbrl/frames/us-gaap/AccountsPayableCurrent/USD/CY2019Q1I.json"
Public ua As String = "My Edgar Reader [email protected]"
Public accept As String = ""
'Public accept As String = "application/json"
'Public accept As String = "text/plain"
'Public accept As String = "*/*"
Public Sub RunAttempts()
Debug.WriteLine("HttpWebRequest:")
Debug.WriteLine(Fetch1(sourceUrl))
Debug.WriteLine("-----------")
Debug.WriteLine("")
Call Fetch2(sourceUrl)
Debug.WriteLine("WebClient:")
Debug.WriteLine(Fetch3(sourceUrl))
Debug.WriteLine("-----------")
Debug.WriteLine("")
Debug.WriteLine("WebClient File:")
Debug.WriteLine(Fetch4(sourceUrl))
Debug.WriteLine("-----------")
Debug.WriteLine("")
End Sub
Public Function Fetch1(url As String) As String
Dim request As HttpWebRequest
Dim response As HttpWebResponse
Dim reader As StreamReader
'request = WebRequest.Create(url)
request = DirectCast(WebRequest.Create(url), HttpWebRequest)
request.ContentType = "application/json"
'request.Method = "POST"
request.Method = "GET"
request.UserAgent = ua
request.Host = "www.sec.gov"
request.Headers("Accept-Encoding") = "gzip, deflate"
If Not (accept = "") Then request.Accept = accept
Dim result As String = ""
Try
response = DirectCast(request.GetResponse(), HttpWebResponse)
If response Is Nothing = False Then
reader = New StreamReader(response.GetResponseStream())
result = reader.ReadToEnd()
Else
result = "No Data"
End If
Catch ex As Exception
result = ex.Message
End Try
Return result
End Function
Public Async Sub Fetch2(page As String)
Dim request As New HttpRequestMessage(HttpMethod.Get, New Uri(page))
If Not (accept = "") Then request.Headers.Accept.Add(New Headers.MediaTypeWithQualityHeaderValue(accept))
request.Headers.TryAddWithoutValidation("User-Agent", ua)
request.Headers.TryAddWithoutValidation("Host", "www.sec.gov")
request.Headers.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate")
Dim client As HttpClient = New HttpClient
Using response As HttpResponseMessage = Await client.SendAsync(request)
Using content As HttpContent = response.Content
'content.Headers.Remove("Content-Type")
'content.Headers.Add("Content-Type", "application/json")
Dim result As String = Await content.ReadAsStringAsync()
If result Is Nothing Then
Debug.WriteLine("HttpClient:No result")
Else
Debug.WriteLine("HttpClient:")
Debug.WriteLine(result)
Debug.WriteLine("-----------")
Debug.WriteLine("")
End If
End Using
End Using
End Sub
Public Function Fetch3(url As String) As String
Dim client As New WebClient()
'ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
client.Headers.Add("User-Agent", ua)
client.Headers.Add("Host", "www.sec.gov")
client.Headers.Add("Accept-Encoding", "gzip, deflate")
If Not (accept = "") Then client.Headers.Add("accept", accept)
Dim ans As String = ""
Try
ans = client.DownloadString(New Uri(url))
Catch ex As WebException
If ex.Response Is Nothing = False Then
'Dim dataStream As Stream = ex.Response.GetResponseStream
'Dim reader As New StreamReader(dataStream)
'ans = reader.ReadToEnd()
ans = ex.Message & "|" & ex.Status.ToString
Else
ans = "No Response Stream"
End If
End Try
Return ans
End Function
Public Function Fetch4(url As String) As String
Dim client As New WebClient()
Dim tmpFile As String = Path.Combine(Path.GetTempPath(), "edgar.txt")
Debug.WriteLine(tmpFile)
Try
client.DownloadFile(New Uri(url), tmpFile)
Return File.ReadAllText(tmpFile)
Catch ex As WebException
If ex.Response Is Nothing = False Then
Return ex.Message & "|" & ex.Response.ContentType & " " & ex.Response.ContentLength.ToString
Else
Return ex.Message
End If
End Try
End Function
End Module
uj5u.com熱心網友回復:
問題是您的主機標頭設定為“www.sec.gov”,因此請求將轉到“https://www.sec.gov/api/xbrl/frames/us-gaap/AccountsPayableCurrent/USD/CY2019Q1I.json” ' 而不是 'https://data.sec.gov/api/xbrl/frames/us-gaap/AccountsPayableCurrent/USD/CY2019Q1I.json'
解決方案很簡單,只需從以下位置編輯主機頭:
request.Host = "www.sec.gov"
到:
request.Host = "data.sec.gov"
下次如果您無法確定問題,請嘗試使用 Fiddler 查看您的請求有什么問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/335610.html
上一篇:如何從asp.netvb.net中的sql查詢中的物件獲取值
下一篇:隨機化影像將進入的圖片框
