2017-09-07 6 views
0

私は、volleyとJsonArrayAuthRequestを使用してAPIを取得しています。 APIは私の電話機の一部で動作しますが、他の人には失敗します(APIレベル23、marshmellowを使用しています)Volley Content-Typeが特定の電話機で変更されない

エラーメッセージは「400」です。リクエストが不正です。これはContent = "text/html; charset = us-ascii"を示しています。しかし、私は期待エンティティがjson /アプリケーションであることを知っています。

私はgetHeaders()とgetBodyContentType()をオーバーライドしようとしました。

String baseUrl = Constants.constants.getApiUrl() +"Events/"; 
    String url = baseUrl + query; 
    //Log.i("url",url); 
    RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); 
    JsonArrayAuthRequest eventRequest = new JsonArrayAuthRequest(url, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        ObjectMapper mapper = new ObjectMapper() 
          .disable(FAIL_ON_UNKNOWN_PROPERTIES); // fails if not 1 to 1 mapping 
        ArrayList<Event> data = new ArrayList<>(); 
        for (int i = 0; i < response.length(); ++i) { 
         Object res; 
         try { 
          res = response.get(i); 
          //Log.i("res", res.toString()); //grabs the filtered events already 
          Event e = mapper.readValue(res.toString(), Event.class); 
          data.add(e); 
         } catch (Exception e) { 
          Log.d("error", e.toString()); 
          return; 
         } 
        } 
        //Log.i("Browse", "got " + Integer.toString(data.size()) + " events!"); 

        browse = (BrowseFragment) adapter.getItem(0); 
        browse.setData(data); 
        progressDialog.dismiss(); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        if (error == null || error.networkResponse == null) { 
         Toast toast = Toast.makeText(getApplicationContext(), "No Response from server", Toast.LENGTH_LONG); 
         toast.show(); 
         return; 
        } 
        String errorMessage = "Could not stringify errorMessage"; 
        try { 
         errorMessage = new String(error.networkResponse.data,"UTF-8"); 
        } catch (UnsupportedEncodingException e) { 
         e.printStackTrace(); 
        } 
        Toast toast = Toast.makeText(getApplicationContext(), error.networkResponse.statusCode + ": " + errorMessage, Toast.LENGTH_LONG); 
        toast.show(); 

        progressDialog.dismiss(); 

       } 
      }); 
    queue.add(eventRequest) 
} 


private class JsonArrayAuthRequest extends JsonArrayRequest { 
     JsonArrayAuthRequest(String url, Response.Listener<JSONArray> 
listener, Response.ErrorListener errorListener) { 
      super(url, listener, errorListener); 
     } 

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

      SharedPreferences settings = getSharedPreferences("account", MODE_PRIVATE); 
      headers.put("Authorization", UserInfo.User.getToken()); 
      //Log.i("headers",headers.get("Content-Type") + " " + headers.get("Authorization")); 
      return headers; 
     } 
     @Override 
     public String getBodyContentType() 
     { 
      return "application/json; charset=utf-8"; 
     } 
    } 

答えて

0

これはコンテンツタイプのエラーではありません。実際のエラーはapi urlに400エラーの原因となっていたスペースが含まれていたことです。私の電話は以前のURLをキャッシュしていなければなりませんか?わかりません。しかし、私はこの解決策について間違った方向を見てきました。

関連する問題