>我有一个http get方法,如下所示
public async Task<Ricetta> GetRicettaByNome(string nome)
{
Ricetta exist = default(Ricetta);
var ExistRicetta = await appDbContext.Ricetta.FirstOrDefaultAsync(n => n.Nome == nome);
if(ExistRicetta != null)
{
exist = ExistRicetta;
return exist;
}
exist = null;
return exist;
}
它由控制器调用,如下所示:
[HttpGet("exist/{nome}")]
public async Task<ActionResult<Ricetta>> GetRicettaByNome(string nome)
{
try
{
if (string.IsNullOrEmpty(nome))
{
return BadRequest();
}
var result = await ricetteRepository.GetRicettaByNome(nome);
if (result != null)
return result;
return default(Ricetta);
}
catch (Exception)
{
return StatusCode(StatusCodes.Status500InternalServerError, "NON HAI INTERNET!");
}
}
但是当我调用我的 api 来通过这样的 httpclient 获取响应时:
public async Task<Ricetta> GetRicettaByNome(string nome)
{
return await httpClient.GetJsonAsync<Ricetta>($"api/Ricette/exist/{nome}");
}
我收到此错误: 输入不包含任何 JSON 令牌。当 isFinalBlock 为 true 时,预期输入以有效的 JSON 令牌开头。路径: $ |行号: 0 |BytePositionInLine: 0.">
这是从 API 返回null
时的预期结果。default(Ricetta)
和null
一样.
您将不得不以其他方式处理此问题。 当您知道您将始终拥有数据时,GetJsonAsync<T>()
是方便的速记。这不是处理 null 的最佳选择。
可以看到(在开发工具中)null 的状态代码为 204(无内容)。您可以检测到它或从GetJsonAsync捕获错误。
您的错误存在于您的存储库部分中,其中GetJsonAsync<>
.您需要在Deserialize
之前使用HttpResponseMessage
并检查内容,例如:
private async ValueTask<T> GetJsonAsync(string ur)
{
using HttpResponseMessage response = awiat _client.GetAsync(url);
//some method to validate response
ValidateResponse(response);
//then validate your content
var content = await ValidateContent(response).ReadAsStringAsync();
return JsonSerializer.Desrialize<T>(content, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
}
//Here is the method that you need
private HttpContent ValidateContent(HttpResponseMessage response)
{
if(string.IsNullOrEmpty(response.Content?.ReadingAsString().Result))
{
return response.Content= new StringContent("null",Encoding.UTF8, MediaTypeNames.Application.Json);
}
else
{
return response.Content;
}
}