处理错误请求的自定义错误消息

Handle custom Error message on Bad request

我正在开发 Android 应用程序(客户端)。服务器使用 C#。当我特别提出某些 Post 的请求时,我收到错误请求的错误消息,例如 'HTTP/1.1 404 Not Found',这在我搜索的项目不正确时没关系。但是在错误的请求下,服务器还向我发送了 JSON 中的消息正文,如下所示:

  {
    "responseMessage":"The item you searched not found"
  }

有没有办法获取此消息(而不是错误请求消息 'HTTP/1.1 404 Not Found')并将其显示为对错误请求的响应?后端工作正常,我在 Postman 上检查过。我的 Post 请求代码是这样的:

  Json := '{ '+
          ' "code":"'+str+'",'+
          ' "userid":'+userid+''+
          ' } ';
  JsonToSend := TStringStream.Create(Json, TEncoding.UTF8);
  try
   IdHTTP1.Request.ContentType := 'application/json';
   IdHTTP1.Request.CharSet := 'utf-8';

   try

   sResponse := IdHTTP1.Post('http://....', JsonToSend);

   except      
       on e  : Exception  do
        begin
             ShowMessage(e.Message); // this message is : HTTP/1.1 404 Not Found
             Exit;
        end;

   end;

  finally
  JsonToSend.Free;
  end;

要接收有关错误的 JSON 内容,您有 2 个选择:

  1. 抓住凸起的 EIdHTTPProtocolException 并从其 ErrorMessage 属性 中读取 JSON,而不是 Message 属性:

    try
      sResponse := IdHTTP1.Post(...);
    except      
      on E: EIdHTTPProtocolException do
      begin
        sResponse := E.ErrorMessage;
      end;
      on E: Exception do
      begin
        ShowMessage(e.Message);
        Exit;
      end;
    end;
    
  2. TIdHTTP.HTTPOptions属性中启用hoNoProtocolErrorExceptionhoWantProtocolErrorContent标志以防止TIdHTTP.Post()引发EIdHTTPProtocolException在 HTTP 失败时,而只是 return 将 JSON 添加到您的 sResponse 变量。如果需要,您可以使用 TIdHTTP.ResponseCode 属性 来检测 HTTP 故障:

    IdHTTP1.HTTPOptions := IdHTTP1.HTTPOptions + [hoNoProtocolErrorException, hoWantProtocolErrorContent];
    
    try
      sResponse := IdHTTP1.Post(...);
      if IdHTTP1.ResponseCode <> 200 then ...
    except      
      on E: Exception do
        ...
    end;