在 Volley 中实现 POST 请求时出现错误代码 400,但在使用 OkHttp 时却没有

Posted

技术标签:

【中文标题】在 Volley 中实现 POST 请求时出现错误代码 400,但在使用 OkHttp 时却没有【英文标题】:Error Code 400 when implementing POST Request in Volley, but not when implementing with OkHttp 【发布时间】:2018-03-26 13:09:12 【问题描述】:

下面是我在使用 OkHttp 时用来发送 POST 请求的类:

public class PostExample 
private static final MediaType JSON
        = MediaType.parse("application/json;");

private OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException 
    RequestBody body = RequestBody.create(JSON, json);
    Request request = new Request.Builder()
            .url(url)
            .post(body)
            .build();
    try (Response response = client.newCall(request).execute()) 
        return response.body().string();
    


String bowlingJson(String user, String password) 
    String str =  "" +
            "\"username\": \"" + user + "\", " +
            "\"password\": \"" + password + "\"" +
            "";
    System.out.println(str);
    return str;


public static void main(String[] args) throws IOException 
    PostExample example = new PostExample();
    String json = example.bowlingJson(args[0], args[1]);
    String response = example.post("http://192.168.43.123:8000/api/jwt-auth/", json);
    System.out.println(args[0] + " " + args[1]);
    System.out.println(response);


这很好用,它给了我一个 JSON 对象作为响应的字符串。 下面给出的是与 Volley 一起使用时几乎相同的东西,只是它给了我一个 400 错误

公共类 PostAssistant

    private Context context;
    private RequestQueue queue;

    public PostAssistant(Context context) 
        this.context = context;
        queue = Volley.newRequestQueue(context);
    

    private void post(String url, final String user , final String password) throws IOException 
        StringRequest postRequest = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>()
                
                    @Override
                    public void onResponse(String response) 
                        // response
                        Log.d("Response", response);
                    
                ,
                new Response.ErrorListener()
                
                    @Override
                    public void onErrorResponse(VolleyError error) 
                        // error
                        Log.d("Error.Response", "");
                    
                
        )
        
            @Override
            protected Map<String, String> getParams()
            
                Map<String, String> params = new HashMap<>();
                params.put("username", user);
                params.put("password", password);

                return params;
            

            @Override
            public String getBodyContentType()
            
                return "application/json";
            
        ;
        queue.add(postRequest);
    

    private void connect(String user, String password) throws IOException 
        post(Constants.loginUrl , user , password);
    

    public void connect(String[] args) throws IOException 
        connect(args[0] , args[1]);
    

这是logcat中显示的错误:

E/Volley: [5322] BasicNetwork.performRequest: Unexpected response code 400 for http://192.168.43.123:8000/api/jwt-auth/

【问题讨论】:

【参考方案1】:

我通过将 getBodyContentType() 更改为 getHeaders() 来修复它

        @Override
        public Map<String , String> getHeaders()
        
            Map<String, String> params = new HashMap<String, String>();
            params.put("Content-Type", "application/json");
            return params;
        

【讨论】:

以上是关于在 Volley 中实现 POST 请求时出现错误代码 400,但在使用 OkHttp 时却没有的主要内容,如果未能解决你的问题,请参考以下文章

发出 ajax Post 请求时出现 403 禁止错误

从子域向域发送 POST 请求时出现错误 419

发出 POST 请求时出现 Google Cloud Function CORS 错误

从 React 向 Django 发送 post 请求时出现 400(错误请求)

尝试向 API 发送 POST 请求时出现属性错误 - Django

发出 POST 请求时出现推送错误的 Laravel WebSocket