我正在尝试使用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:意外的响应代码500 当我在https://apitester.com/上对API进行测试时,它告诉我它已通过,并且出现此错误
响应标题 HTTP / 1.1 500内部服务器错误 连接:保持活动状态 日期:2018年11月10日,星期六19:56:18 GMT 服务器:Apache 传输编码:分块 内容类型:application / json 通过:1.1 vegur
任何想法如何解决这个问题?是API还是我?
答案 0 :(得分:0)
HTTP状态代码表明错误在服务器端。代码 500 被解释为内部服务器错误,要解决此问题,您必须检查可能导致它的原因。在这种情况下,可能是由于代码错误引起的,您可以打开error_log查看错误并采取相应措施。
这可能是由于服务器功能暂时不可用(例如访问数据库)或同时打开的多个连接超出关联的mysql资源而导致的。
有时,该错误未记录到error_log文件中。如果您使用面板,请在首页的指标标签下打开错误,然后根据向服务器请求的时间进行检查。如果您没有使用cpanel
,请查找相应的服务器日志。
通过您的问题中传递的链接,除非您的服务器端脚本中覆盖了错误代码或将其硬编码,否则不应出现错误代码。
请参阅以下三个测试:
这样,我既设置了时间参数,又设置了癌症参数,如您所见,错误代码为500,但在响应体内,状态为200时一切正常。
有了这个,即使我只设置了一个参数,我仍然有答案。在响应正文中,有一个错误不是服务器错误,而是自定义错误:缺少参数。猜猜返回的HTTP代码是什么(500)
如果删除所有参数该怎么办?
一切正常。 HTTP状态代码和响应正文。
这告诉我,作者是否希望您听定制的请求status
,而不是返回的HTTP状态代码。那只是我的观点。
答案 1 :(得分:0)
我发现您正在使用的API上的错误正在发送响应代码500 +响应数据。 在齐射中,每当检测到响应码不是200到299时,就在齐射中运行Error Listeners进行处理。这就是为什么代码因为Volley Error Listener获得Call First而错过了Response数据的原因。
Postman Picture mark with both Points
坦率地说,这是API设计的非标准不良方法,它也会在Responses上抛出状态代码。
我也想告诉你的事
开始使用Postman(如果您不使用它)
这是我建议您开始使用的帮助程序库,它可以处理大多数方法调用,并通过自定义消息和单个状态代码为您提供更好的错误处理。
希望这将帮助您应对未来的方法。