如何处理 Android 中的意外响应 500

How to deal with unexpected response 500 in Android

我正在尝试使用 Volley 从外部 API 检索 JSON。 这是我的代码

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    final TextView mTextView = findViewById(R.id.testreq);
    RequestQueue queue = Volley.newRequestQueue(this);
    String url = "https://horoscope-free-api.herokuapp.com/?time=today&sign=cancer";
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    // Display the first 500 characters of the response string.
                    mTextView.setText("Response is: "+ response.substring(0,500));
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            mTextView.setText("That didn't work");
            Log.d("Error", error.toString());
        }
    });
    queue.add(stringRequest);
}

似乎响应已完成,但我收到此错误

E/Volley: [277] BasicNetwork.performRequest: Unexpected response code 500 and when I ran a test on the API in https://apitester.com/ It tells me its passed and I get this error

回应Headers HTTP/1.1 500 内部服务器错误 连接:keep-alive 日期:2018 年 11 月 10 日星期六 19:56:18 GMT 服务器:阿帕奇 Transfer-Encoding:分块 Content-Type: application/json 通过:1.1 素食主义者

有什么解决办法吗?是API还是我?

5 开头的 HTTP 状态代码通知错误发生在服务器端。代码 500 被解释为 Internal Server Error,要解决此问题,您必须检查可能导致它的原因。这可能是由代码错误引起的,在这种情况下,您可以打开 error_log 查看错误并采取相应措施。

这可能是由于服务器功能暂时不可用造成的,例如访问数据库或同时打开的连接超过关联的 mysql 资源。

其他时候,错误没有记录到 error_log 文件中。如果您使用 cpanel,请在主页的 Metrics 选项卡下打开 Errors 并根据您向服务器请求的时间进行检查。如果您没有使用 cpanel 查找相应的服务器日志。

随着 link 在您的问题中传递,错误代码不应出现,除非它在您的服务器端脚本中被覆盖或硬编码。

查看这三个测试:

有了这个,我设置了时间和癌症参数,正如你所看到的,错误代码是 500,但在响应主体中,状态 200 一切正常。

有了这个,即使我只设置一个参数,我也有答案。在响应正文中,有一个错误不是服务器错误而是自定义错误:缺少参数。猜猜返回的HTTP代码是什么(500)

如果我删除所有参数会怎样?

一切都很好。 HTTP 状态代码和响应正文。 这告诉我作者是否希望您收听自定义请求 status 而不是返回的 HTTP 状态代码。这只是我的观点。

我在 API 上发现了一个错误,您正在使用它发送响应代码 500 + 响应数据。 在截击中,只要检测到 200 到 299 以外的响应代码,截击 运行 就会有错误侦听器来处理它。这就是为什么您的代码错过了您的响应数据,因为 Volley 错误侦听器首先调用。

Postman Picture mark with both Points

坦率地说,这是 API 设计的非标准糟糕方式,它也会在响应中抛出状态代码。

想告诉你的事情太多了:

  1. 开始使用 Postman(如果您没有使用它)

  2. Jamun Volley Library

开始使用帮助程序库,这是我建议您使用的,它可以处理您的大多数方法调用,并通过自定义消息和单独的状态代码为您提供更好的错误处理。

希望这能帮助您应对未来的方法。