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"); } 

仍然得到相同的错误!

  • 如何得到响应机构改造exception?
  • Volley JSONException:在0的字符0处输入结束
  • 如何使用Android的WCF服务
  • EOFException在执行同步PUT请求时进行改造
  • 任何人都可以解释OAuth吗?
  • Android Volley给了我400错误
  • REST - 如何限制未经授权的客户端软件的访问
  • 未parsing的主机exceptionAndroid
  • 我有同样的问题,我从标题中删除:

      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