如何使用Volley发送POST请求

时间:2017-05-09 06:45:01

标签: android post firebase android-volley token

所以我有这个客户,我想通过使用截击的帖子请求更新客户对象中的fcm_token值,但它不起作用..!

请参阅json链接>> http://www.mocky.io/v2/5911638a1200001e020fb5d2

到目前为止我的尝试..

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

private static final String TAG = "MyFirebaseIIDService";

@Override
public void onTokenRefresh() {

    String refreshedToken = FirebaseInstanceId.getInstance().getToken();

    sendRegistrationToServer(refreshedToken);
}

private void sendRegistrationToServer(String token) {

    RequestQueue requestQueue = Volley.newRequestQueue(this);

    HashMap<String, String> params = new HashMap<String, String>();
    params.put("fcm_token", token);

     Customer me = Hawk.get("user");
     String URL = API_URLs.TokenURL(me.getID());

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method
            .POST, URL, new JSONObject(params),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                   //Log
                }
            },
            new Response.ErrorListener()

            {
                @Override
                public void onErrorResponse(VolleyError error) {
                    error.printStackTrace();
                   //Log


                }

            }
    );

    requestQueue.add(jsObjRequest);

更新

我改变了对此的请求但仍未改变..!?

 JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
            URL, null,
            new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    Log.d(TAG, response.toString());
                 }
            }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
         }
    }) {

        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("fcm_token", token);

            return params;
        }

    };

     requestQueue.add(jsonObjReq);

更新2

所以经过很多尝试仍然没有解决,但我会解释我想要做的事情,也许你会得到我想要完成的事情,我想根据用户ID将我的设备fcm令牌发送到服务器登录,所以我有一个客户模型类,其值为fcm_token必须在发出请求后将其设置为我的令牌,该过程在网络服务器顺便说一下。

到目前为止,这是我的代码..

MyFirebaseInstanceIDService类

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

private static final String TAG = "MyFirebaseIIDService";
String refreshedToken;

@Override
public void onTokenRefresh() {

    refreshedToken = FirebaseInstanceId.getInstance().getToken();

    Hawk.put("token", refreshedToken);

}

public static void sendRegistrationToServer(Context context) {

   }
 }

客户模型类

公共类客户{

@SerializedName("avatar_url")
@Expose
private String cusPicURL;

@SerializedName("first_name")
@Expose
private String firstName;

@SerializedName("last_name")
@Expose
private String lastName;

@SerializedName("fcm_token")
@Expose
private String token;

public String getToken() {
    return token;
}

public void setToken(String token) {
    this.token = token;
}

// ..... more variables & setters and getters
存储库类中的

我的请求代码(所有请求都在这里..)

   public static void UpdateFCM_Token(final Context context, final String token) {

    RequestQueue requestQueue = Volley.newRequestQueue(context);

    Customer me = Hawk.get("user");
    Log.i("USER ID: ", "" + me.getID());
    String URL = API_URLs.TokenURL(me.getID());

    JsonObjectRequest req = new JsonObjectRequest(Request.Method.POST,
            URL, null,
            new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    try {
                        JSONObject o = response.getJSONObject("customer");
                        Gson gson = new Gson();
                        Customer customer = gson.fromJson(o.toString(), Customer.class);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                    Log.d("FCM OnResponse", response.toString());
                }
            }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d("FCM Error: ", "" + error.getMessage());
        }
    }) {

        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("fcm_token", token);
            return params;
        }
    };
    requestQueue.add(req);
 }

MainActivity中的片段

  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    // code..

    String token = Hawk.get("token");
    Log.i("TOKEN", token);
    DriverRepository.UpdateFCM_Token(getActivity(), token);

    return rootView;
}

日志

enter image description here

3 个答案:

答案 0 :(得分:1)

您可能必须覆盖JsonObjectRequest的getParams并传递POST参数。

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method
            .POST, URL, null, listener, errorListener){
    protected Map<String,String> getParams() throws AuthFailureError{
        return postParamsMap;
    }
}

您也可以使用StringRequest代替JsonObjectRequest

StringRequest jsonObjReq = new StringRequest(Request.Method.POST,
            URL, new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {
                    Log.d(TAG, response);
                    //Converting the response to JSON
                    JSONObject jsonObj = new JSONObject(response);
                 }
            }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
         }
    }) {

        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("fcm_token", token);

            return params;
        }

    };
requestQueue.add(jsonObjReq);

答案 1 :(得分:1)

嘿,你想从新的JsonObjectRequest中添加Map + remove null(....... null,listener ....):

 private void sendRegistrationToServer(String token) {

RequestQueue requestQueue = Volley.newRequestQueue(this);

HashMap<String, String> params = new HashMap<String, String>();
params.put("fcm_token", token);

 Customer me = Hawk.get("user");
 String URL = API_URLs.TokenURL(me.getID());

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST, url,
        new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
               //Log
            }
        },
        new Response.ErrorListener()

        {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
               //Log


            }

        }
){
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String,String> map = new HashMap();
            //add your params here to the map
            return map;
        }
    };

requestQueue.add(jsObjRequest);

答案 2 :(得分:0)

经过一些工作后,我使用okhttp3解决了问题,因为我的应用中的剩余请求使用的是volley,但是这一个只有okhttp3 ,我希望这不是一个坏习惯。

非常感谢你们的帮助..!

这是我的请求方法中的代码..以防有人可能遇到同样的问题。

 public static void UpdateFCM_Token(final String token) {

    Customer me = Hawk.get("user");
    Log.i("USER ID: ", "" + me.getID());
    String URL = API_URLs.TokenURL(me.getID());

    OkHttpClient client = new OkHttpClient();

    String json = "{\"fcm_token\":\"" + token + "\"}";

    Log.i("Json  : ", json);

    MediaType mediaType = MediaType.parse("application/json");
    RequestBody body = RequestBody.create(mediaType, json);
    okhttp3.Request request = new okhttp3.Request.Builder()
            .url(URL)
            .post(body)
            .addHeader("content-type", "application/json")
            .build();

    try {
        okhttp3.Response response = client.newCall(request).execute();
        isTokenSent = true;
        Log.i("response ", response + "");

    } catch (IOException e) {
        e.printStackTrace();
        Log.i("IOException", "" + e);

    }
  }