我有以下代码写在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响应。
答案 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;
}
}
}
}