5

발리 문자열 요청을 사용하여 서버에서 토큰에 액세스하려고합니다. 나는 또한 JsonObjectRequest를 만들려고 시도했다. 둘 다 아래에 있습니다.발리를 사용하여 WebAPI 호출

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

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


     StringRequest request = new StringRequest(Request.Method.POST, url, 
       new Response.Listener<String>() 
       { 
        @Override 
        public void onResponse(String response) { 
         // response 
         Log.e("Response", response); 
        } 
       }, 


       new Response.ErrorListener() 
       { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         // error 
         Log.e("Error.Response", error.networkResponse.toString()); 
        } 
       } 
     ) { 



      @Override 
      public Map<String, String> getHeaders() throws AuthFailureError { 
       Map<String,String> params = new HashMap<>(); 
       params.put("Content-Type","application/x-www-form-urlencoded"); 
       //..add other headers 
       return params; 
      } 

      @Override 
      protected Map<String, String> getParams() 
      { 
       Map<String, String> params = new HashMap<String, String>(); 
       params.put("scope", "openid email phone profile offline_access roles"); 
       params.put("resource", "window.location.origin"); 
       params.put("grant_type", "password"); 
       params.put("username", "[email protected]"); 
       params.put("password", "tempPxxx"); 


       return params; 
      } 

     }; 

     requestQueue.add(request); 

.

public void getAuthenticationTokens(Object param1, final CustomListener<String> 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.e(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<>(); 
         Map<String,String> params = new HashMap<>(); 
         params.put("Content-Type","application/x-www-form-urlencoded"); 
         //..add other headers 
         return params; 
        } 
     }; 



     requestQueue.add(request); 

.

E/Volley: [31388] BasicNetwork.performRequest: Unexpected response code 400 for https://lw.xxx.co.uk/connect/token 

:

나는 서버에서 다음과 같은 응답을 얻을.

내 서버 측 코드를 작성한 동료가 다음 각도 코드 (API와 작동하는 코드)를 Android로 변환하는 방법을 요청했습니다.

아무도 도와 드릴 수 있습니까?

getLoginEndpoint(userName: string, password: string): Observable<Response> { 

     let header = new Headers(); 
     header.append("Content-Type", "application/x-www-form-urlencoded"); 

     let searchParams = new URLSearchParams(); 
     searchParams.append('username', userName); 
     searchParams.append('password', password); 
     searchParams.append('grant_type', 'password'); 
     searchParams.append('scope', 'openid email phone profile offline_access roles'); 
     searchParams.append('resource', window.location.origin); 

     let requestBody = searchParams.toString(); 

     return this.http.post(this.loginUrl, requestBody, { headers: header }); 
    } 

답변

5

문제는 몇 가지 사항이었습니다.

나는 params.put ("resource", "window.location.origin"); "을"params.put ("resource", "https://lw.xxx.co.uk"); "

또한 Volley가 getHeaders 재정의를 무시한다는 것을 알았 기 때문에이 메서드를 주석 처리하고 다음을 사용하여 헤더를 설정했습니다.

@Override 
      public String getBodyContentType() { 
       return "application/x-www-form-urlencoded"; 
      } 

public void getAuthenticationTokens(Object param1, final String userName, final String password, final CustomListener<JSONObject> listener) 
    { 
     String url = "https://lw.xxx.co.uk/connect/token"; 
     StringRequest request = new StringRequest(Request.Method.POST, url, 
       new Response.Listener<String>() 
       { 
        @Override 
        public void onResponse(String response) { 
         // response 
         Log.e("Response", response); 

        } 
       }, 
       new Response.ErrorListener() 
       { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         // error 
         Log.e("Error.Response", error.networkResponse.toString()); 
        } 
       } 
     ) { 

      /* @Override 
      public Map<String, String> getHeaders() throws AuthFailureError { 
       Map<String,String> params = new HashMap<>(); 
       params.put("Content-Type","application/x-www-form-urlencoded"); 
       //..add other headers 
       return params; 
      }*/ 
      @Override 
      public String getBodyContentType() { 
       return "application/x-www-form-urlencoded"; 
      } 

      @Override 
      protected Map<String, String> getParams() 
      { 
       Map<String, String> params = new HashMap<String, String>(); 
       params.put("scope", "openid email phone profile offline_access roles"); 
       params.put("resource", "https://lw.xxx.co.uk"); 
       params.put("grant_type", "password"); 
       params.put("username", userName); 
       params.put("password", password); 
       return params; 
      } 


      @Override 
      protected VolleyError parseNetworkError(VolleyError response) { 
       try { 

        String json = new String(response.networkResponse.data, HttpHeaderParser.parseCharset(response.networkResponse.headers)); 
        Log.e(TAG, "reponse error = " + json); 
       }catch (Exception e){} 
       return super.parseNetworkError(response); 
      } 
     }; 
     requestQueue.add(request); 

    }//end of getAuthenticationTokens 
+0

고맙습니다. 거기에 어떤 문제가 있는지 우리에게 자세히 설명해 주시겠습니까? –

+1

@IntelliJAmiya 안녕하세요. 예. 죄송합니다. 답변에 대한 의견을 업데이트했습니다. 불행히도 그 사람이 자신의 게시물을 삭제 했으므로 내 의견도 사라졌습니다. 지금 내 대답을 업데이트했습니다. 감사 – turtleboy

관련 문제