我通过Web服务器调用从API获取一些数据。如果我使用基本的网络电话(使用HttpGet),我能够获得我期待的数据。但是通过使用Volley Json,我得到一个空数组[]作为回应。
我得到以下jsonarray响应。
[
{
"nickname":"panikos",
"username":"panikos@gmail.com",
"user_type":"LEADER",
"latest_steps":"2"
},
{
"nickname":"nikki",
"username":"nikki@gmail.com",
"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);
每次我在排球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,但没有运气。
抱歉英语不好,问题很长。任何人都可以指出我..谢谢!!!
答案 0 :(得分:2)
我遇到了类似的问题,问题的根源是您尝试使用params执行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());
}
希望这有帮助!