2015-04-24 3 views
2

Я новичок в Залп и я пытаюсь сделать запрос Начать работу сVolley JsonArrayRequest Сообщение запроса не работает

JsonArrayRequest

Из многих ответов, которые я нашел на StackOverflow, я попытался следующим образом -

private void getCounts() { 
    String url = "http://192.168.1.100/json/count.php"; 
    JsonArrayRequest req = new JsonArrayRequest(url, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        Log.d(TAG, response.toString()); 
        hidepDialog(); 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyLog.d(TAG, "Error: " + error.getMessage()); 
      Log.d(TAG, "Error: " + error.getMessage()); 
      Toast.makeText(getApplicationContext(), 
        error.getMessage(), Toast.LENGTH_SHORT).show(); 
      hidepDialog(); 
     } 
    }) { 
     @Override 
     protected Map<String, String> getParams() { 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("LastUpdatedAt", "0"); 
      return params; 
     } 

     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      HashMap<String, String> headers = new HashMap<String, String>(); 
      headers.put("Content-Type", "application/json; charset=utf-8"); 
      headers.put("User-agent", "My useragent"); 
      return headers; 
     } 

     @Override 
     public byte[] getBody() { 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("LastUpdatedAt", "0"); 

      if (params != null && params.size() > 0) { 
       Log.d(TAG, encodeParameters(params, getParamsEncoding()).toString()); 
       return encodeParameters(params, getParamsEncoding()); 
      } 
      return null; 
     } 

     protected byte[] encodeParameters(Map<String, String> params, String paramsEncoding) { 
      StringBuilder encodedParams = new StringBuilder(); 
      try { 
       for (Map.Entry<String, String> entry : params.entrySet()) { 
        encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding)); 
        encodedParams.append('='); 
        encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding)); 
        encodedParams.append('&'); 
       } 
       return encodedParams.toString().getBytes(paramsEncoding); 
      } catch (UnsupportedEncodingException uee) { 
       throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee); 
      } 
     } 

    }; 

    AppController.getInstance().addToRequestQueue(req); 
} 

Как можно видеть, я пробовал оба getParams() и getBody() отправить LastUpdatedAt, как сообщение запроса, но независимо от того, что я пытаюсь значение не отвечал и возвращает нуль на сервере.

Я даже пробовал использовать JsonArrayRequest(Request.Method.POST, ..., а также отправил «параметры» в JsonObject в запрос, но даже эти два не работали.

В одном из similar question, использование следующего класса предлагается -

public class CustomJsonRequest extends Request { 

Map<String, String> params;  
private Response.Listener listener; 

public CustomJsonRequest(int requestMethod, String url, Map<String, String> params, 
         Response.Listener responseListener, Response.ErrorListener errorListener) { 

    super(requestMethod, url, errorListener); 
    this.params = params; 
    this.listener = responseListener; 
} 

@Override 
protected void deliverResponse(Object response) { 
    listener.onResponse(response); 

} 

@Override 
public Map<String, String> getParams() throws AuthFailureError { 
     return params; 
} 

@Override 
protected Response parseNetworkResponse(NetworkResponse response) { 
    try { 
     String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
     return Response.success(new JSONObject(jsonString), 
     HttpHeaderParser.parseCacheHeaders(response)); 
    } catch (UnsupportedEncodingException e) { 
     return Response.error(new ParseError(e)); 
    } catch (JSONException je) { 
     return Response.error(new ParseError(je)); 
    } 
} 

} 

Но я не мог сделать работу createRequestSuccessListener Response у слушателя и его ошибки слушателя.

В то же подобный вопрос, следующий конструктор предложил -

public JsonArrayRequest(int method, String url, JSONObject jsonRequest, 
     Listener<JSONArray> listener, ErrorListener errorListener) { 
    super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), 
     listener, errorListener); 
} 

Но я не мог понять, как заставить его работать?

+0

Я не мог понять, где * точно * ваша проблема. Тем не менее, у меня также было несколько вопросов, которые делали запросы POST с использованием волейбола в прошлом. Этот ответ решил мою проблему, возможно, вы могли бы посмотреть на нее и посмотреть, помогает ли она: http://stackoverflow.com/questions/19837820/volley-jsonobjectrequest-post-request-not-working/19945676#19945676 – tjiagoM

ответ

2

Попробуйте сделать что-то вроде:

 String url = "http://192.168.1.100/json/count.php"; 

     final JSONObject _jsonRequest = new JSONObject(); 
     _jsonRequest.put("key", value); 

     JsonArrayRequest _stringRequest = new JsonArrayRequest(
     url , new Response.Listener<JSONArray>() { 

      @Override 
      public void onResponse(JSONArray response) { 

       // Your code here 

      } 

     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 

       // Your code here 

      } 

     }){ 

      @Override 
      public byte[] getBody() { 

       try { 

        return _jsonRequest.toString().getBytes(getParamsEncoding()); 

       } catch (UnsupportedEncodingException uee) { 

        return null; 

       } 

      } 

      @Override 
      public Map<String, String> getHeaders() throws AuthFailureError { 

       Map<String, String> _params = new HashMap<String, String>(); 

       _params.put("Content-type", "application/json"); 

       return _params; 

      } 

     }; 

     AppController.getInstance().addToRequestQueue(_stringRequest); 
+0

Я пробовал, но это не сработало. Существует некоторый конфликт с 'JsonArrayRequest' и' Response.Listener '. Поэтому, если я попытаюсь поместить ваш код как таковой, он показывает ошибку. Если я заменю 'String' на' JSONArray' в обоих местах, он будет запущен. но затем выдает ошибку - 'com.android.volley.ParseError: org.json.JSONException: Value Вы типа java.lang.String не могут быть преобразованы в JSONArray' –

+0

Извините, я допустил ошибку. Вы должны изменить 'Response.Listener ' '' Response.Listener '. Теперь показанная ошибка сообщения связана с тем, что сервер отправляет обратно. Он должен посылать 'String' вместо' Array'. Поэтому в этом случае вам нужно использовать 'StringRequest' вместо' JsonArrayRequest' и изменить 'Response.Listener ' на 'Response.Listener ', а также 'public void onResponse (ответ JSONArray)' на 'public void onResponse (String ответ) ' –

+0

Спасибо за ваш ответ. Как я упоминал в своем предыдущем комментарии, я исправил «Response.Listner » на «». И я думаю, что узнал, почему теперь он бросает 'String нельзя преобразовать в JSONArray'. Потому что мой JsonObject похож на '_jsonRequest.put (« LastUpdatedAt »,« 2015-03-15 00:30:04 »);' и этот 'LastUpdatedAt', полученный моим PHP-кодом через' $ _POST ["LastUpdatedAt" ] ', ** который не работает в этом случае. ** Поэтому мой запрос sql не работает и возвращает ошибку в строке. Итак, любые мысли о том, как заставить его работать? –

Смежные вопросы