2015-04-24 161 views
2

我是新來的凌空我試圖讓發佈採購工作,凌空JsonArrayRequest POST請求不工作

JsonArrayRequest

從很多答案我已經在計算器發現,我試過如下 -

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作爲發佈採購信息,但無論我怎麼努力值不貼和服務器返回null。

我甚至嘗試過使用JsonArrayRequest(Request.Method.POST, ...以及在請求中發送'params'作爲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和錯誤監聽。

同樣類似的問題,下面的構造建議 -

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 '有一些衝突。所以,如果我嘗試把你的代碼這樣,它顯示錯誤。如果我在兩個地方用'JSONArray'替換'String',它就會運行。但隨後拋出錯誤 - 'com.android.volley.ParseError:org.json.JSONException:值你的類型java.lang.String不能轉換爲JSONArray' –

+0

對不起,我犯了一個錯誤。您應該將'Response.Listener '更改爲'Response.Listener '。現在顯示的消息錯誤是由於服務器發送回來的。它必須發送一個'String'而不是'Array'。因此,在這種情況下,您必須使用'StringRequest'而不是'JsonArrayRequest'並將'Response.Listener '改爲'Response.Listener '以及'public void onResponse(JSONArray response)''public void onResponse(String響應)' –

+0

感謝您的回覆。正如我在之前的評論中提到的,我將'Response.Listner '修正爲''。我想我發現了,爲什麼現在拋出'String不能轉換爲JSONArray'錯誤。因爲我的JsonObject類似於'_jsonRequest.put(「LastUpdatedAt」,「2015-03-15 00:30:04」);''和這個'LastUpdatedAt',被我的PHP代碼通過'$ _POST [「LastUpdatedAt」 ]',**這在這種情況下不起作用。**這就是爲什麼我的sql查詢失敗並返回字符串錯誤。那麼關於如何使它工作的任何想法? –