Android Volley使用Request.POST调用oData,给出403错误

时间:2018-03-05 14:36:39

标签: android odata android-volley

我使用Android的Volley API调用SAP的oData服务,并为Request.POST获取HTTP 403错误。但对于另一个服务程序的Request.GET工作正常。我可以知道我的代码调用oData服务是否有任何问题。

我从第一次请求调用中获取MYSAPSSO2令牌和CSRF令牌。但收到身份验证错误。知道这里缺少什么吗?

使用JQUERY / SAPUI5的相同oData POST服务工作正常,没有任何问题。

try {
            /** json object parameter**/
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("SO", so);
            jsonObject.put("STATUS", status);
            jsonObject.put("NET_VALUE", amount);
            Log.i("XXXX", thisMethod+"jsonObject params"+ jsonObject.toString() + "");
            JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject jsonRespObj) {
                    Log.i("XXXX", thisMethod+"Response from notification service: " + jsonRespObj.toString());
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    Log.i("XXXXX", thisMethod+"Error Response: " + volleyError);
                    volleyError.printStackTrace();
                }
            }
            ) {
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> params = new HashMap<String, String>();
                    if (mysapsso2 != null) {
                        Log.i("XXX", thisMethod+"MYSAPSSO2 is : " + TokenHandler.getMYSAPSSO2Token());
                        Log.i("XXXX", thisMethod+"X-CSRF-Token is : " + TokenHandler.getCSRFToken());
                        params.put("Cookie", ServiceClass.mysapsso2);
                        params.put("X-CSRF-Token", TokenHandler.getCSRFToken());
                        params.put("contentType", "application/json");
                    }
                    return params;
                }
            };
            queue.add(jsonObjectRequest);
        } catch (JSONException e) {
            Log.e("XXX", thisMethod+"There was an error => " + e.getMessage());
            e.printStackTrace();
        }
        catch (Exception e) {
            Log.e("XXXX", thisMethod+"There was an error => " + e.getMessage());
            e.printStackTrace();
        }

1 个答案:

答案 0 :(得分:0)

使用带有JsonObjectRequest的StringRequest。获取json编码的响应字符串&amp;创建json对象。下面的代码对我来说很好。试试吧。

public void getPostJsonData() {
        final String URL = "URL";
        StringRequest stringRequest = new StringRequest(Request.Method.POST, URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONObject obj = new JSONObject(response);
                            JSONArray jsonArray = obj.getJSONArray("server_response");
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject JO = jsonArray.getJSONObject(i);
                                fname = JO.getString("firstname"); //or JO.toString()
                                lname = JO.getString("lastname");
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(ActivityName.this, error.toString(), Toast.LENGTH_LONG).show();
                    }
                }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> hashMap = new HashMap<String, String>();
                hashMap.put("Cookie", ServiceClass.mysapsso2.toString);
                hashMap.put("X-CSRF-Token", TokenHandler.getCSRFToken().toString);
                hashMap.put("contentType", "application/json");
                return hashMap;
            }
        };
        final RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
        requestQueue.addRequestFinishedListener(new RequestQueue.RequestFinishedListener<Object>() {
            @Override
            public void onRequestFinished(Request<Object> request) {
                requestQueue.getCache().clear();
            }
        });
    }