2017-11-09 18 views
0

WebAPIとトークン認証を使用するようにアプリケーションを変換しようとしています。私はApache httpから離れ、ボレーを使用しています。Volley java.lang.UnsupportedOperationException

以下、ボレーのリクエストを処理するNetworkManagerというクラスがあります。 私の主なアクティビティには、networkManagerクラスからメソッドgetAuthenicationTokensを呼び出すログインボタンがあります。私はcustomeListenerを使用して、呼び出しアクティビティに応答を戻しました。

CustomListener:

public interface CustomListener<T> 
{ 
    public void getResult(T object); 
} 

活動:

buttonLogin.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 



       NetworkManager.getInstance().getAuthenticationTokens(null, new CustomListener<JSONObject>() 
       { 
        @Override 
        public void getResult(JSONObject result) 
        { 

         Log.e(TAG, "Json object length = " + result.length()); 

        } 
       }); 

。 NetworkManagerの中

方法:

public void getAuthenticationTokens(Object param1, final CustomListener<JSONObject> listener) 
    { 

     //String url = prefixURL + "this/request/suffix"; 
     String url = "https://lw.xxx.co.uk/connect/token"; 

     Map<String, Object> jsonParams = new HashMap<>(); 


     jsonParams.put("scope", "openid email phone profile offline_access roles"); 
     jsonParams.put("resource", "window.location.origin"); 
     jsonParams.put("grant_type", "password"); 
     jsonParams.put("username", "[email protected]"); 
     jsonParams.put("password", "tempPxxx"); 

     JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, new JSONObject(jsonParams), 
       new Response.Listener<JSONObject>() 
       { 
        @Override 
        public void onResponse(JSONObject response) 
        { 
         Log.d(TAG + ": ", "somePostRequest Response : " + response.toString()); 
         if(null != response.toString()) 
          listener.getResult(response); 
        } 
       }, 

       new Response.ErrorListener() 
       { 
        @Override 
        public void onErrorResponse(VolleyError error) 
        { 
         if (null != error.networkResponse) 
         { 
          Log.d(TAG + ": ", "Error Response code: " + error.networkResponse.statusCode); 
          listener.getResult(null); 
         } 
        } 
       }){ 
        @Override 
        public Map<String, String> getHeaders() throws AuthFailureError { 
         Map<String,String> params = super.getHeaders(); 
         if(params==null)params = new HashMap<>(); 
         params.put("Content-Type","application/x-www-form-urlencoded"); 
         //..add other headers 
         return params; 
        } 
     }; 



     requestQueue.add(request); 
    } 

次の投稿(サブハッシュによる回答)を使用してリクエストにヘッダーを追加しようとしましたが、ヘッダーの追加から次の例外が発生しています。

link

例外:

NetworkDispatcher.run: Unhandled exception java.lang.UnsupportedOperationException 
                      java.lang.UnsupportedOperationException 
                         at java.util.AbstractMap.put(AbstractMap.java:203) 
                         at loneworker.carefreegroup.com.loneworker.NetworkManager$3.getHeaders(NetworkManager.java:100) 
                         at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:93) 
                         at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:96) 
                         at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112) 

ヘッダーを追加することでどのような問題が発生しているのか誰にでも分かります。 例外がライン100上で、ここでは

params.put("Content-Type","application/x-www-form-urlencoded"); 
+0

このエラーは、super.getHeaders()を変更できず、新しいHashMapでコピーしてから追加しようとしているようです。 –

+0

@RC。こんにちは私はちょうどMap params = new HashMap <>();を試してみました。 params.put( "Content-Type"、 "application/x-www-form-urlencoded");しかし、それはまだ動作しません。それはどういう意味ですか? – turtleboy

答えて

0

あなたが試してみました:

Map<String, String> params = new HashMap<>(super.getHeaders()); 

を、私はそれをテストし、それは私のために働きました。