无法从HttpWebRequest获得响应

时间:2012-09-10 15:56:28

标签: c# mono google-api httpresponse

我有以下代码写在mono(Mono on ubuntu)

string URI = "http://www.google.com/webmasters/tools/feeds/http%3A%2F%2Fwww%2Ekarkala%2Ein%2F/keywords/?access_token=ya29.ABCDEFGI7bzJmlLWtk290M-PkNx20ej9p6a0sxoaxFPe_7qypXuW7Q";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URI);
request.Headers.Add("GData-Version", "2");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

该代码是获取Google网站站长API响应的一部分。 但是在尝试获取响应时出现以下错误

The remote server returned an error: (400) Bad Request.

系统   在System.Net.HttpWebRequest.CheckFinalStatus(System.Net.WebAsyncResult result)[0x00000] in:0   在System.Net.HttpWebRequest.SetResponseData(System.Net.WebConnectionData data)[0x00000] in:0

如果我在浏览器上复制粘贴相同的URI,我就能看到xml响应。

3 个答案:

答案 0 :(得分:2)

您必须设置请求内容类型:

request.ContentType = "text/xml";

否则,远程服务器将不知道如何处理您的请求。

答案 1 :(得分:0)

这可能是URI的值被编码的方式吗? 您是否尝试过使用Fiddler

它具有非常好的功能,您可以调查Web请求。 希望有所帮助。

答案 2 :(得分:0)

这是我在Xamarin中使用的一个函数,它获取了一个CSRF令牌,但是你可以看到我如何设置我的请求。就像aevitas所说,你需要按照第3行指定Content-Type

public JsonToken getCSRFToken(){
        var request = HttpWebRequest.Create(string.Format(this.apiBaseUrl + @"/druidapi/user/token.json"));
        request.ContentType = "application/json";
        request.Method = "GET";

        Console.Out.WriteLine("GET call to: {0}", this.apiBaseUrl.ToString() + @"/druidapi/user/token.json");

        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {
            if (response.StatusCode != HttpStatusCode.OK)
                Console.Out.WriteLine("Error fetching data. Server returned status code: {0}", response.StatusCode);
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                var content = reader.ReadToEnd();

                if(string.IsNullOrWhiteSpace(content)) {
                    Console.Out.WriteLine("Response contained empty body...");
                }
                else {
                    Console.Out.WriteLine("Response Body: \r\n {0}", content);
                }

                if (content == null) {
                    throw new Exception ("content is NULL");
                } else {

                    JsonToken deserializedToken = JsonConvert.DeserializeObject<JsonToken>(content);
                    return deserializedToken;
                }

            }
        }
    }