Android Volley给了我400错误

Loo*_*oii 21 rest android android-volley

我正在尝试向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;
        }
   });
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

我看过很多例子,我真的没看到这里出了什么问题.有人有什么想法?

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

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;
    }
Run Code Online (Sandbox Code Playgroud)

并改为getHeaders():

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

仍然得到同样的错误!

小智 19

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

  headers.put("Content-Type", "application/json");
Run Code Online (Sandbox Code Playgroud)

现在它很棒!


小智 8

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

当我在头回调中使用内容类型时,我在logcat中获得了400响应状态.我评论了headers.put("Content-Type","application/json; charset = utf-8"); 因为我正在传递原始json在身体,同时调用api.screenshot为postman附加.它会帮助

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

  }
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)


Roh*_*hit 6

此错误可能有多种原因。

当然,正如其他人所说,原因之一是您可能缺少或不正确地设置了“内容类型”标头。

如果您正确地实现了这一点,另一个可能的原因是您直接从您的 URL 发送参数。可能存在 params 是包含一些空格的字符串的情况。这些空格会导致通过 Volley 的 GET 请求出现问题。你需要找到另一种方法来解决它。就这样。


Leo*_*nto 3

400 表示请求错误,可能是您Content-Type=application/json的标头丢失了

  • 这是别的东西,`JsonRequest`默认有这个 (3认同)