从api网站下载.json时出现ResponseStatusLine错误

时间:2019-04-11 10:07:24

标签: c# json api header httprequest

我一直在尝试使用Discogs API制作一个供个人使用的小型应用程序,以便搜索单个艺术家及其专辑,到目前为止,该程序使用非官方的Discogs C#应用程序仍然有效。现在的问题是,我提取专辑曲目列表的唯一方法是使用我从每个专辑请求中获取的资源URL(例如https://api.discogs.com/releases/2890373)。

我尝试从每个URL中提取.json,即使使用适当的标头,我仍然会收到ResponseLine错误。

添加了带有我的使用者密钥和秘密密钥的Authorization标头,例如:

httpWebRequest.Headers.Add("Authorization", "Discogs key=xxx, secret=yyy");

...添加了UserAgent,但仍然无法正常工作。

我已经在Python中尝试了同样的方法,并且效果很好,但是我不想每次想要专辑信息时都运行Python应用程序。

private void scrape_button_Click(object sender, EventArgs e) {
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.discogs.com/releases/2890373");
            httpWebRequest.Method = WebRequestMethods.Http.Get;
            httpWebRequest.Timeout = 12000;
            httpWebRequest.ContentType = "application/vnd.discogs.v2.html+json";
            httpWebRequest.Headers.Add("UserAgent", "matija_search/0.1");
            string file;
            var response = (HttpWebResponse)httpWebRequest.GetResponse();
            using(var sr = new StreamReader(response.GetResponseStream())) {
                file = sr.ReadToEnd();
            }
        }

这是试图获取数据的按钮。

import requests
import json
info = requests.get('https://api.discogs.com/releases/2890373')
data = info.json()
with open('data.json', 'w') as f:
    json.dump(data, f)

这是等效的python,实际上可以工作...

1 个答案:

答案 0 :(得分:0)

好的,解决了这个问题。 我没有以正确的方式添加UserAgent。 固定代码如下:

private void scrape_button_Click(object sender, EventArgs e) {
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.discogs.com/releases/2890373");
            httpWebRequest.Method = WebRequestMethods.Http.Get;
            httpWebRequest.Accept = "application/vnd.discogs.v2.html+json";
            httpWebRequest.UserAgent = "matija_search/1";
            string file;
            var response = (HttpWebResponse)httpWebRequest.GetResponse();
            using(var sr = new StreamReader(response.GetResponseStream())) {
                file = sr.ReadToEnd();
            }
            var contentsToWriteToFile = JsonConvert.SerializeObject(file);
            TextWriter writer = new StreamWriter("test.json", false);
            writer.Write(contentsToWriteToFile);
        }