【问题标题】:Why is RestSharp returning text/html instead of json?为什么 RestSharp 返回 text/html 而不是 json?
【发布时间】:2021-09-04 20:00:37
【问题描述】:

我正在尝试使用 TMDB API 构建微服务。

代码:

using System.Text.Json;
using Microsoft.Extensions.Options;
using Net5Micro.Config;
using RestSharp;

namespace Net5Micro.Services
{
    public class ApiClient : IApiClient
    {
        private readonly ServiceSettings _settings;
        
        public ApiClient(IOptions<ServiceSettings> settings)
        {
            _settings = settings.Value;
        }
        
        public Movie GetById(string id)
        {
            //Init rest client
            var client = new RestClient($"{_settings.TMDBhost}/movie/{id}");
            
            //Init rest request
            var request = new RestRequest(Method.GET);
            request.RequestFormat = DataFormat.Json;

            //Add Request params
            request.AddParameter("api_key", _settings.ApiKey, ParameterType.GetOrPost);

            //Calling Api 
            var response = client.Get(request);
            
            var movies = JsonSerializer.Deserialize<Movie>(response.Content);
            
            return movies;
        }

        // Za najpopularnije
        public Movies Discover(string sort)
        {
            //Init rest client
            var client = new RestClient($"{_settings.TMDBhost}/discover/movie/");
            
            //Init rest request
            var request = new RestRequest(Method.GET);
            request.RequestFormat = DataFormat.Json;
            
            //Add Request params
            request.AddParameter("api_key", _settings.ApiKey, ParameterType.GetOrPost);
            request.AddParameter("sort_by", sort, ParameterType.GetOrPost);
            
            //Calling Api 
            var response = client.Get(request);
            
            var movies = JsonSerializer.Deserialize<Movies>(response.Content);
            
            return movies;
        }
        
        public record Movie(int id, string original_title, string poster_path);
        public record Movies(int page, Movie[] results);
    }
}

GetById() 工作正常,但Discover() 会引发错误。在调试时我发现返回的值是text/html 而不是 json;我认为这就是问题所在。

这是错误

发生异常:CLR/System.Text.Json.JsonException

System.Text.Json.dll 中出现“System.Text.Json.JsonException”类型的异常,但未在用户代码中处理:“输入不包含任何 JSON 令牌。当 isFinalBlock 为真时,预期输入以有效的 JSON 令牌开头。路径:$ |行号:0 | BytePositionInLine: 0。'

发现内部异常,详情请参阅变量窗口中的 $exception。

最里面的异常
System.Text.Json.JsonReaderException :输入不包含任何 JSON 标记。当 isFinalBlock 为真时,预期输入以有效的 JSON 令牌开头。行号:0 | BytePositionInLine: 0。

在 System.Text.Json.ThrowHelper.ThrowJsonReaderException(Utf8JsonReader& json, ExceptionResource 资源, Byte nextByte, ReadOnlySpan1 bytes) at System.Text.Json.Utf8JsonReader.Read() at System.Text.Json.Serialization.JsonConverter1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state))

我是 .NET 的新手,所以我不知道如何解决它。提前致谢。

【问题讨论】:

    标签: c# restsharp


    【解决方案1】:

    它返回一个 HTTP 301 永久移动。也许您应该遵循该移动响应并改为访问不同的 URL。从location header as defined in RFC2616 获取。

    您的代码缺少错误处理。它可能应该仅在 HTTP 200 OK 的情况下处理响应。从 HTTP 401 Forbidden 解析 JSON 也可能没有意义。

    【讨论】:

    • 非常感谢,我关注了 URL,发现返回 application/json 的有点不同。
    【解决方案2】:

    您可以尝试一些事情...

    1. 确保您使用的 URL 正确,例如,删除尾部斜杠。
    2. 对象的返回值真的是json:Movies吗?还是List&lt;Movie&gt;?即 { json of an object } vs. [ json of a list of objects ]​​i>
    3. 您希望 'Accept' 标头是 'application/json' 而不是内容类型,但由于您的 GET 示例有效,我真的认为它是 #1 或 #2。

    试试这个:

            public Movies Discover(string sort)
            {
                //Init rest client
                var client = new RestClient($"{_settings.TMDBhost}/discover/movie"); // no trailing slash
                
                //Init rest request
                var request = new RestRequest(Method.GET);
                //request.RequestFormat = DataFormat.Json; // not required
                
                //Add Request params
                request.AddParameter("api_key", _settings.ApiKey, ParameterType.GetOrPost);
                request.AddParameter("sort_by", sort, ParameterType.GetOrPost);
                
                //Calling Api - can deserialize directly to your Movies var.
                var movies = client.GetAsync<Movies>(request).Result;
                // #2 - might be a list that you get back? if so .. something like this:
                // var mlist = client.GetAsync<List<Movie>>(request).Result;
                // var movies = new Movies(); // add your mlist as needed to movies.                        
                return movies;
            }
    

    您也可以尝试在 Postman 中测试 .../movie 端点以查看实际返回的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2012-07-10
      • 2014-01-17
      • 2012-05-19
      • 1970-01-01
      • 2016-03-10
      • 2020-09-30
      相关资源
      最近更新 更多