2013-04-04 116 views
0

尝试使用RestSharp向第三方应用程序发送请求时,出现406错误。我是REST的新手,所以我不得不承认,我甚至都不知道你可以添加标题。我试图添加这些,但我仍然得到相同的问题:其余Sharp - 406错误 - 接受标头不匹配

var client = new RestClient(myURL);    

    RestRequest request = new RestRequest("restAction", Method.POST);  

    request.AddHeader("Accept", "text/plain"); 
    request.AddHeader("Content-Type", "text/plain"); 

    request.AddParameter("parameter1", param1); 
    request.AddParameter("parameter2", param2); 

    var response = client.Execute(request); 

从我读过的,这可能是处理名为“接受”的标题。是对的吗?

任何想法可能会发生什么?

+1

如果将accept标头设置为“\ */\ *”,还是会得到406状态码吗?这应该告诉服务器可以用任何喜欢的格式进行响应,所以如果你仍然使用406,那么服务器似乎有一些内容协商问题。 (似乎默认情况下,RestSharp的Accept头中包含“\ *”,所以我很惊讶你最初得到了406,但它可能是“\ *”无法识别,而是“\ */\ * “is) – 2013-04-05 02:16:27

+0

一般来说,在HTTP中,当客户端向服务器发出请求时,会告诉服务器准备理解(接受)哪种格式。可接受格式的列表是Accept头的用途。如果服务器无法使用Accept头中的任何媒体类型进行响应,则它将返回406.否则,它将指示它在响应的Content-Type头中选择的媒体类型。在Accept头中放入“\ */\ *”会告诉服务器客户端可以处理任何响应媒体类型。 – 2013-04-05 02:24:07

+2

@JenS谢谢。我现在得到一个不同的错误 - 资源不可用。正如你可能知道的那样,获得不同的错误是开发者可以拥有的最大的乐趣之一! – Narnian 2013-04-05 12:28:57

回答

4

通常在HTTP中,当客户端向服务器发出请求时,它会告诉服务器准备理解(接受)哪种格式。可接受格式的列表是Accept头的用途。如果服务器无法使用Accept头中的任何媒体类型进行响应,则它将返回406.否则,它将指示它在响应的Content-Type头中选择的媒体类型。在Accept头中放入“*/*”可以告诉服务器客户端可以处理任何响应媒体类型。

在我对你的问题的原始评论中,我说RestSharp看起来像默认情况下Accept头中包含“*”,但是看起来更接近我现在看到它实际上不是。因此,如果您没有像在此处所做的那样覆盖Accept标头,则默认标头值为"application/json","application/xml","text/json","text/x-json","text/javascript","text/xml",并且您正在与之交谈的服务器似乎不会说出任何这些媒体类型。

如果您使用的服务器不会说json或xml,我认为您不能使用RestSharp,除非您创建自己的解串器。我不确定您是否可以从公开API执行此操作,或者您是否必须自己修改源代码并为您自己的需要重新编译它。

由于您仍然从服务器获取HTTP错误,因此我建议您现在将RestSharp从等式中拿出来,直接向服务器讲述HTTP,直到您真正从服务器获得正确响应。您可以使用像Fiddler这样的工具直接发起HTTP请求。当你发送请求时(现在在调试阶段),发送一个“*/*”的Accept标题来绕过406.一旦你找出了服务器可以发回给你的媒体类型,你应该改变这又回到了你可以阅读并且你知道服务器可以发送的媒体类型。

听起来这里的主要问题实际上只是不知道服务器的协议。如果有任何关于您正在与之交谈的服务的文档,我会非常仔细地阅读这些文档,以确定它准备好回应哪些媒体类型,以及如何制作它期望的网址。