0

尝试使用 RestSharp 向第三方应用程序发布请求时出现 406 错误。我是 REST 新手,所以我不得不承认我什至不知道你可以添加标题。我尝试添加这些,但我仍然遇到同样的问题:

    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);

从我读过的内容来看,这可能是在处理一个名为“accept”的标头。是对的吗?

知道会发生什么吗?

4

1 回答 1

8

一般来说,在 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。一旦您确定了服务器可以发回给您的媒体类型,您应该更改这又回到了您知道可以阅读并且知道服务器可以发送的媒体类型。

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

于 2013-04-05T16:54:51.813 回答