2017-05-09 225 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 –