我通过 Web 服务器调用从 API 获取一些数据。如果我使用基本的网络调用(使用 HttpGet),我就能够获取我期望的数据。但是通过使用 Volley Json 我得到一个空数组 [] 作为响应。
我收到以下 jsonarray 响应。
[
{
"nickname":"panikos",
"username":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e393828d8a888c90a3848e828a8fcd808c8e" rel="noreferrer noopener nofollow">[email protected]</a>",
"user_type":"LEADER",
"latest_steps":"2"
},
{
"nickname":"nikki",
"username":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="452b2c2e2e2c052228242c296b262a28" rel="noreferrer noopener nofollow">[email protected]</a>",
"user_type":"MASTER",
"latest_steps":"3"
},
...........
...........
...........
...........
]
这是我使用 volley 从服务器获取数据的代码
JsonArrayRequest arrReq = new JsonArrayRequest(lUrl, new
Response.Listener<JSONArray>()
{
public void onResponse(JSONArray arg0)
{
Log.d("debug","json Array"+arg0.toString());
mListener.notifyResponse(arg0.toString());
};
}, new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError arg0) {
Log.d("debug", "Error Response"+arg0.toString());
if (arg0.networkResponse == null) {
if (arg0.getClass().equals(TimeoutError.class)) {
// Show timeout error message
mListener.notifyConnection("Oops.Timeout! Please check your connection.");
}
}else{
mListener.notifyError(arg0);
}
}
})
{
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> params = new HashMap<String, String>();
String creds = String.format("%s:%s",XippXX,XXcvXX);
String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.NO_WRAP);
params.put("Authorization", auth);
return params;
}
};
AppController.getInstance().adToRequestQure(arrReq);
每次我在 volley Json 响应中得到一个空数组 [] 时,都使用此代码。但我尝试了与基本 Http 调用相同的操作(通过使用 Asynctask),它给出了我所期望的正确数据。
这是我使用普通 Web 请求调用获取数据的基本代码::
@Override
protected Void doInBackground(String... params) {
try {
HttpGet request=new HttpGet(params[0]);
DefaultHttpClient httpClient=new DefaultHttpClient();
String creds = String.format("%s:%s","XippXX","XXcvXX");
String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.NO_WRAP);
request.setHeader("Authorization", auth);
HttpResponse response=httpClient.execute(request);
HttpEntity Entity=response.getEntity();
String jsondata = EntityUtils.toString(Entity);
Log.d("debug", "Json Data in Asynctask:: "+jsondata);
JSONArray lJsonArray=new JSONArray(jsondata);
Log.d("debug", "Json Array Data:: "+lJsonArray.toString());
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
这段代码工作完美..但我很高兴知道我在 Volley Json 中哪里犯了错误?我尝试了太多场景(我无法在此处显示),例如 StringRequest,以及其他一些场景,例如 Base64.DEFAULT,但没有运气。
抱歉英语不好而且问题很长。任何人都可以指出我..谢谢!!!
最佳答案
我遇到了类似的问题,问题的根源是您尝试使用参数执行 GET,它与 POST 不同,因此您需要修改您的请求。
这是一个可能对您有帮助的通用模板,尝试这样的请求(对参数进行修改..):
编辑:
Map<String, Object> params = new HashMap<>() ;
String creds = String.format("%s:%s",XippXX,XXcvXX);
String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.NO_WRAP);
params.put("Authorization", auth);
String urlWithParams = createGetWithParams(originalUrl, params);
DecodedStringRequest request = new DecodedStringRequest(Request.Method.GET, urlWithParams,
new Response.Listener<String>()
{
@Override
public void onResponse(String response)
{
Log.d(TAG + ": ", "Volley Response: " + response.toString());
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error)
{
if (null != error.networkResponse)
{
Log.d(TAG + ": ", "Error Response code: " + error.networkResponse.statusCode);
}
}
});
requestQueue.add(request);
并在此处检查您的回复:
public class DecodedStringRequest extends StringRequest
{
private static final String TAG = "DecodedStringRequest";
private final Response.Listener<String> mListener;
public DecodedStringRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener)
{
super(method,url, listener, errorListener);
mListener = listener;
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response)
{
try
{
//add some more of your magic here if needed... maybe print the data to see
String responseBody = new String(response.data, "utf-8");
return (Response.success(responseBody, getCacheEntry()));
}
catch (UnsupportedEncodingException e)
{
VolleyLog.e("UnsupportedEncodingException");
Log.d(TAG +" NetworkResponse Exception", e.getMessage() );
return (Response.success("Uploaded, problem with url return", getCacheEntry()));
}
}
@Override
protected void deliverResponse(String response)
{
mListener.onResponse(response);
}
}
哦还有:
private String createGetWithParams(String url, Map<String, Object> params)
{
StringBuilder builder = new StringBuilder();
for (String key : params.keySet())
{
Object value = params.get(key);
if (value != null)
{
try
{
value = URLEncoder.encode(String.valueOf(value), HTTP.UTF_8);
if (builder.length() > 0)
builder.append("&");
builder.append(key).append("=").append(value);
}
catch (UnsupportedEncodingException e)
{
Log.d(TAG + " createGetWithParams: ", e.getMessage());
}
}
}
return (url + "?" + builder.toString());
}
希望这有帮助!
关于android - 使用 volley Json 获取空数组 [] 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30637147/