2017-05-09 232 views
0

因此,我有這個客戶,並且我想通過發佈請求使用volley更新客戶對象中的fcm_token值,但它不起作用。如何使用Volley發送POST請求

見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); 

UPDATE

我請求改變這一點,仍然沒有改變..!?

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它必須在發出請求後它必須設置爲我的令牌,這個過程發生在web服務器btw。

這裏是我到目前爲止的代碼..

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

+0

後錯誤日誌 –

+0

請參閱本http://www.androidhive.info/2014/05/android-working-with-volley-library-1/ –

+0

@SushobhNadiger我沒有,請更新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); 

    } 
    } 
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); 
+0

看到更新,仍然沒有工作..! –

+0

您可以嘗試'StringRequest'而不是'JsonObjectRequest'並將響應字符串轉換爲JSON。 – VishnuSP

+0

你能告訴我它將如何轉換? –

1

嘿,你想添加Map +刪除null從新的JsonObjectRequest(....... 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); 
+0

看到更新,仍然沒有工作..! –

+0

嘿,從請求中刪除null,看看我的代碼新的JsonObjectRequest(....)是不同的,那麼你的 – SupremeRon

+0

它不會允許我,它一直顯示錯誤..!看到這張圖https://image.ibb.co/mhoHGQ/zzzzzzxx.jpg –