使用volley Json获取空数组[]响应

时间:2015-06-04 07:04:06

标签: android arrays json android-volley http-get

我通过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,但没有运气。

抱歉英语不好,问题很长。任何人都可以指出我..谢谢!!!

1 个答案:

答案 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());
}

希望这有帮助!