2015-04-24 124 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查询失败并返回字符串错误。那么关于如何使它工作的任何想法? –