当前位置: 首页 > 知识库问答 >
问题:

Android凌空给我400错误

孙阳舒
2023-03-14

我正在尝试向我的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<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;
    }

并将获取标题()更改为:

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

仍然收到相同的错误!

共有3个答案

宋翔
2023-03-14

此错误可能有多种原因。

当然,正如其他人所说,其中一个原因可能是您缺少或设置了不正确的“Content-type”头。

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

庄星汉
2023-03-14

如果要将json值传递到body中(原始json)。无需将内容类型设置为标题。put(“内容类型”,“application/json;charset=utf-8”);

当我在头回调中使用内容类型时,我在logcat中得到的400响应状态。我评论了标题。put(“内容类型”,“application/json;charset=utf-8”);因为我在调用api时在body中传递原始json。邮递员截图附呈。这会有帮助的

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<String, 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
廉学潞
2023-03-14

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

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

现在它工作得很好!

 类似资料:
  • 我尝试发送一个删除请求到我的服务器,但我得到一个400坏的请求错误代码。我找了很多,但我找不到任何有帮助解决方案。当我尝试与邮差,请求工作良好。 这是来自Postman的curl命令的外观: 这是我的Java代码: 我还尝试在头中不设置Content-Type,但当我得到一个415错误时,我还删除了getBodyContentType()方法,但这也没有改变。 还有什么能帮上忙的点子吗?

  • 我正在从服务器下载文件。我用排球来做。 这是我的代码 以下是错误侦听器的错误消息在一些弱网络连接上,我收到以下逻辑消息 我不明白失败的原因是什么,因为大多数错误消息都返回null。我很确定这是因为请求超时,我知道如何增加超时,但是我应该在错误侦听器中编写什么代码,以便在出现错误时获得正确的错误消息。

  • 关于在项目中使用截击,我有几个问题: 这个库可以在任何Java项目中使用,还是仅在Android中使用

  • 我使用的是volley.jar,在编译时没有错误,但是有运行时异常。 然后添加volley.jar和build path。什么是问题? CustomAdapter.java

  • 如果我点击Debug图标,Android Studio有时会自动创建新的文件,然后抱怨它应该只有一个名为... 可以修复它,但它太烦人了,所以必须有一个可靠的解决方案。 提前致谢 编辑: 我的文件: 我的: 编辑:当我生成和调试时,在控制台中收到以下错误警告: 在此版本中使用了不推荐使用的Gradle功能,使其与Gradle 7.0不兼容。使用'--warning-mode all‘显示单个弃用警

  • **构建指纹:“小米/markw/markw:6.0.1/mmb29m/v8.2.4.0.mbemidl:user/release-keys”版本:“0”abi:“arm”pid:15075,tid:15115,名称:Thread-10486 com.mynamespace.myapp<<<信号6(SIGABRT),代码-6(SI_TKILL),故障地址-------中止消息:'art/runti