如何使用Volley发送POST请求
因此,我有这个客户,并且我想通过发布请求使用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;
}
(日志)
一些作品后,我把它用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);
}
}
你可以必须覆盖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);
看到更新,仍然没有工作..! –
您可以尝试'StringRequest'而不是'JsonObjectRequest'并将响应字符串转换为JSON。 – VishnuSP
你能告诉我它将如何转换? –
嘿,你想添加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);
看到更新,仍然没有工作..! –
嘿,从请求中删除null,看看我的代码新的JsonObjectRequest(....)是不同的,那么你的 – SupremeRon
它不会允许我,它一直显示错误..!看到这张图https://image.ibb.co/mhoHGQ/zzzzzzxx.jpg –
后错误日志 –
请参阅本http://www.androidhive.info/2014/05/android-working-with-volley-library-1/ –
@SushobhNadiger我没有,请更新2 –