Android Volley给了我400错误

我正在尝试向我的API发出POST请求,它在Postman (我得到一个有效的JSON对象),但不使用Volley 。 使用以下代码:

 String URL = "http://somename/token"; RequestQueue queue = Volley.newRequestQueue(StartActivity.this); queue.add(new JsonObjectRequest(Method.POST, URL, null, new Listener() { @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 getHeaders() throws AuthFailureError { HashMap headers = new HashMap(); headers.put("username", "someUsername"); headers.put("password", "somePassword"); headers.put("Authorization", "Basic someCodeHere"); return headers; } @Override protected Map getParams(){ Map params = new HashMap(); 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 createBasicAuthHeader(String username, String password) { HashMap headerMap = new HashMap(); String credentials = username + ":" + password; String base64EncodedCredentials = Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); headerMap.put("Authorization", "Basic " + base64EncodedCredentials); return headerMap; } 

并将getHeaders()更改为:

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

仍然得到同样的错误!

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

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

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

现在它很棒!

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

当我在头回调中使用内容types时,我在logcat中获得了400响应状态。我评论了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 jsonParams = new HashMap(); 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() { @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 getHeaders() throws AuthFailureError { HashMap headers = new HashMap(); // 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 

400表示错误的请求,可能您在标题上缺少Content-Type=application/json

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

  1. GetHeader函数应该是

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

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

此错误可能有多种原因。

当然,正如其他人所说,其中一个原因是,您可能缺少或未正确设置“内容types”标题。

如果您已正确实施,另一个可能的原因是您直接从您的URL发送params。 可能存在params是一个带有一些空格的字符串的情况。 这些空白区域在通过Volley的GET请求中引起问题。 你需要find另一种方法。 就这样。

我有这个错误,现在我已经修好了。 我做了这个链接中的内容 。 你需要做的是

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

希望这可以帮助。

我之前有同样的问题,我在我的项目中得到了解决方案:

 RequestQueue requestManager = Volley.newRequestQueue(this); String requestURL = "http://www.mywebsite.org"; Listener jsonListerner = new Response.Listener() { @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 getParams() throws AuthFailureError { Map params = new HashMap(); params.put("token", account.getToken()); return params; } @Override public Map getHeaders() throws AuthFailureError { HashMap headers = new HashMap(); // do not add anything here return headers; } }; requestManager.add(fileRequest); 

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

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

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

2.)getHeaders内部使用Empty HashMap覆盖该值

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

一切都适用于我的情况。

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

这是我的代码更改。

 @Override protected Map getParams(){ Map params = new HashMap(); if(!isLogout) { params.put("username", username); params.put("password", password); params.put("grant_type", "password"); } else { } return params; } @Override public Map getHeaders() throws AuthFailureError { Map params = new HashMap(); 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标头中引入了一个新行。 在SO中查看我对此问题的回答 。

简短回答:不要使用Base64.encodeToString(),而是将已编码的String放在那里。

我find了一个解决方案,如果你使用postman命中api并且你的api已经定义了类似skill = serializers.JSONField()的序列化器字段,那么那种types的错误发生了 –

解决方案对于POSTMAN-您只需在JSONField ex- skill = serializers.JSONField(binary = True)中添加binary = True

Android或其他客户端的解决方案 – 您只需在JSONField ex- skill = serializers.JSONField()中删除binary = True

Somertimes由于Requesttypes而出现此错误400,因此您需要将Request.Method.GET更改为Request.Method.GET ,而不是像魅力一样。

检查您是否使用了正确的SDK

对于Android Studio / IntelliJIDEA:

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

您最好使用“Google API(xx)”代替Android API