Android Volley给我400错误

我试图做一个POST请求到我的API,它在Postman (我得到一个有效的JSON对象),但不使用Volley 。 用下面的代码:

 String URL = "http://somename/token"; RequestQueue queue = Volley.newRequestQueue(StartActivity.this); queue.add(new JsonObjectRequest(Method.POST, URL, null, new Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { // handle response Log.i("StartActivity", response.toString()); } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // handle error Log.i("StartActivity", error.toString()); } }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> headers = new HashMap<String, String>(); headers.put("username", "someUsername"); headers.put("password", "somePassword"); headers.put("Authorization", "Basic someCodeHere"); return headers; } @Override protected Map<String,String> getParams(){ Map<String,String> params = new HashMap<String, String>(); params.put("grant_type", "client_credentials"); return params; } }); 

我得到以下错误:

 02-12 21:42:54.774: E/Volley(19215): [46574] BasicNetwork.performRequest: Unexpected response code 400 for http://somename/token/ 

我已经看到了很多例子,我不明白这里有什么问题。 任何人的想法?

我用这个方法更新了代码:

 HashMap<String, String> createBasicAuthHeader(String username, String password) { HashMap<String, String> headerMap = new HashMap<String, String>(); String credentials = username + ":" + password; String base64EncodedCredentials = Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); headerMap.put("Authorization", "Basic " + base64EncodedCredentials); return headerMap; } 

并将getHeaders()更改为:

 @Override public Map<String, String> getHeaders() throws AuthFailureError { return createBasicAuthHeader("username", "password"); } 

仍然得到相同的错误!

Solutions Collecting From Web of "Android Volley给我400错误"

我有同样的问题,我从标题中删除:

  headers.put("Content-Type", "application/json"); 

现在它工作得很好!

400表示一个不好的请求,也许你的头上缺lessContent-Type=application/json

400错误是因为Content-Type设置错误。 请执行以下操作。

  1. GetHeader函数应该是

      @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> param = new HashMap<String, String>(); return param; } 
  2. 添加这个新的覆盖function。

      @Override public String getBodyContentType() { return "application/json"; } 

如果你将json的值传递给body(raw json)。不需要设置内容types为headers.put(“Content-Type”,“application / json; charset = utf-8”);

当我在头callback中使用内容types时,我得到的400响应状态logcat.I注释了headers.put(“Content-Type”,“application / json; charset = utf-8”); 因为我正在传递原始json在身体,同时调用api.screenshot为邮递员附加。这将有所帮助

 private void volleyCall(String email, String password) { RequestQueue queue= Volley.newRequestQueue(this); String URL = "http://XXXX.in:8080/XXXX/api/userService/login"; Map<String, String> jsonParams = new HashMap<S[enter image description here][1]tring, String>(); jsonParams.put("email", email); jsonParams.put("password", password); Log.d(TAG,"Json:"+ new JSONObject(jsonParams)); JsonObjectRequest postRequest = new JsonObjectRequest( Request.Method.POST, URL,new JSONObject(jsonParams), new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d(TAG,"Json"+ response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // Handle Error Log.d(TAG, "Error: " + error + "\nStatus Code " + error.networkResponse.statusCode + "\nResponse Data " + error.networkResponse.data + "\nCause " + error.getCause() + "\nmessage" + error.getMessage()); } }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> headers = new HashMap<String,String>(); // headers.put("Content-Type", "application/json; charset=utf-8"); return headers; } @Override public String getBodyContentType() { return "application/json"; } }; queue.add(postRequest); } 

 LogCat: LoginActivity: Json:{"email":"XXXXXX@gmail.com","password":"abcde"} LoginActivity: Error: com.android.volley.ServerError Status Code 400 Response Data [B@63ca992 Cause null messagenull 

我以前有同样的问题,我在我的项目中得到了解决scheme:

 RequestQueue requestManager = Volley.newRequestQueue(this); String requestURL = "http://www.mywebsite.org"; Listener<String> jsonListerner = new Response.Listener<String>() { @Override public void onResponse(String list) { } }; ErrorListener errorListener = new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.w("Volley Error", error.getMessage()); } }; StringRequest fileRequest = new StringRequest(Request.Method.POST, requestURL, jsonListerner,errorListener){ @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String,String> params = new HashMap<String, String>(); params.put("token", account.getToken()); return params; } @Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> headers = new HashMap<String, String>(); // do not add anything here return headers; } }; requestManager.add(fileRequest); 

在上面的代码片段中,我使用Post方法:

我的回答是基于我的经验,所以要注意:

1.)当使用POST方法时,使用“StringRequest”而不是“JsonObjectRequest”

2.)在getHeaders里用空的HashMap覆盖这个值

  example snippet: @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String,String> params = new HashMap<String, String>(); params.put("token", account.getToken()); return params; } @Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> headers = new HashMap<String, String>(); // do not add anything here return headers; } 

一切工作在我的情况。

我有这个错误,现在Iit被修复了。 我做了这个链接所告诉的。 你需要做的是

  1. 去src / com / android / volley / toolbox / BasicNetwork.java
  2. 更改以下行
  if (statusCode < 200 || statusCode > 299) { throw new IOException(); } 

  if (statusCode < 200 || statusCode > 405) { throw new IOException(); } 

希望这可以帮助。

我已经删除了这个params.put(“Content-Type”,“application / x-www-form-urlencoded”);

这是我的代码更改。

 @Override protected Map<String,String> getParams(){ Map<String,String> params = new HashMap<String, String>(); if(!isLogout) { params.put("username", username); params.put("password", password); params.put("grant_type", "password"); } else { } return params; } @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String,String> params = new HashMap<String, String>(); if(isLogout) { params.put("Authorization", "bearer "+LibraryDataModel.getToken()); }else { // Removed this line // params.put("Content-Type", "application/x-www-form-urlencoded"); } return params; } 

在Android 2.3中有一个使用Base64.encodeToString()的问题,因为它在HTTP标头中引入了一个新行。 看看我在这里回答这个问题 。

简短的回答:不要使用Base64.encodeToString(),但把已经编码的string。

这个错误可能有多种原因。 正如其他人所说的一样,也许你错过了或者不正确地设置了“内容types”标题。 如果你正确的实现,其他可能的原因是你直接从你的url发送参数。 当params是一个带有一些空格的string时,可能会出现这种情况。 这些白色空间通过抽签在GET请求中引起问题。 你需要find另一种方式。 就这样。

检查您是否使用正确的SDK

对于Android Studio / IntelliJIDEA:

 File -> Project Structure -> Project -> Project SDK Modules -> Check each modules "Module SDK" 

您最好使用“Google API(xx)”而不是Android API