zoukankan      html  css  js  c++  java
  • Android Volley gives me 400 error

    本文来自:http://stackoverflow.com/questions/21739276/android-volley-gives-me-400-error

    本人是根据文中的其中一方法:

    I had the same problem and i removed from the header:

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

    now it works great!

    以下是全文

    I'm trying to make a POST request to my API and it works in Postman (I get a valid JSON object), but not using Volley. With the following code:

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

    I get the following error:

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

    I have seen a lot of examples and I don't really see what is going wrong here. Anyone any idea?

    I updated the code with this method:

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

    and changed getHeaders() to:

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

    Still getting the same error!

    shareimprove this question
     
        
    are you sure you're putting in the auth headers correctly? if you're using basic auth you should be base64 encoding the username:password I believe – panini Feb 12 '14 at 20:54
        
    @panini I'm already setting the base64 code as "somecodehere". – Loolooii Feb 12 '14 at 21:16
        
    @Loolooii I have the same problem, did you find a solution ? – Robby Smet May 19 '14 at 11:36
        
    @just8laze I'm just using Android's AsyncTask. It's much simpler and it works perfect. See this thread: stackoverflow.com/questions/9671546/asynctask-android-exampl‌​e – Loolooii May 19 '14 at 11:53
        
    @Loolooii Yeah, I already have it working with AsyncTask and HttpPost. No idea why it doesn't work with Volley. Thanks for the response. – Robby Smet May 19 '14 at 11:56

    9 Answers

    I had the same problem and i removed from the header:

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

    now it works great!

    shareimprove this answer
     
        
    ahmagad this worked. – Bolling Oct 6 at 14:05

    400 indicates a bad request, maybe you're missing Content-Type=application/json on your headers

    shareimprove this answer
     
    1  
    it's something else, JsonRequest has that by default – thepoosh Feb 12 '14 at 21:03
        
    I think @thepoosh is right, anyway I tried it and still getting the same error. – Loolooii Feb 12 '14 at 21:16
        
    it's a server error, check the API – thepoosh Feb 12 '14 at 21:17
        
    @thepoosh its not a server error, its a bad request which means if anything its a client error – panini Feb 12 '14 at 21:20
        
    I meant to say, server initiated error, meaning the API was misused – thepoosh Feb 12 '14 at 21:23

    I've got this error and now Iit's been fixed. I did what is told in this link. What you need to do is

    1. go to src/com/android/volley/toolbox/BasicNetwork.java
    2. Change the following lines
     if (statusCode < 200 || statusCode > 299) {
         throw new IOException();
     }
    

    with

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

    Hope this helps.

    shareimprove this answer
     

    I have removed this params.put("Content-Type", "application/x-www-form-urlencoded");

    This is my Code Change.

    @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;
            }
    
    shareimprove this answer
     

    I have the same issue before and I got the solution in my project:

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

    In the code Snippet above I used Post Method:

    My answer is base on my experience and so take note:

    1.) When using POST method use "StringRequest" instead of "JsonObjectRequest"

    2.) inside getHeaders Override the value with an Empty 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;
            }
    

    And everything works in my case.

    shareimprove this answer
     

    In Android 2.3 there is a problem using Base64.encodeToString() as it introduces a new line in HTTP header. See my response to this question here in SO.

    Short answer: Don't use Base64.encodeToString() but put the already encoded String there.

    shareimprove this answer
     

    400 error is because Content-Type is set wrong. Please do the following.

    1. GetHeader function should be as

          @Override
          public Map<String, String> getHeaders() throws AuthFailureError {
      
              Map<String, String> param = new HashMap<String, String>();
      
              return param;
          }
      
    2. Add this new override function.

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

    There can be multiple reasons for this error. One ofcouse as said by others is, maybe you are missing or have improperly set 'Content-type' header. If you are properly implemented that, other possible reason is that you are sending params directly from your url. There may be a case when params is a string with some white spaces in it. These white spaces cause problem in GET requests through volley. You need to find another way around it. Thats all.

    shareimprove this answer
     
    1  
    This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review– silwar Apr 11 at 12:43
        
    This answer worked for me. That is why I posted it here. – Rohit Apr 11 at 15:46

    Check if you are using correct SDK

    For Android Studio / IntelliJIDEA:

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

    Preferably, you should use "Google API (x.x)" instead of An

  • 相关阅读:
    Python3 面向对象小练习
    Python3 面向对象进阶1
    Python3 类的继承小练习
    Python3 类的继承
    Python3 数据结构之词频统计(英文)
    Python3 类与对象之王者荣耀对战小游戏
    Python3 类与对象
    SQL优化单表案例
    SQL性能分析
    索引简介
  • 原文地址:https://www.cnblogs.com/wangoublog/p/6026236.html
Copyright © 2011-2022 走看看