2017-02-10 95 views
3

我想在Android平臺上訪問MS雲端API。無法訪問MS雲端API

所以我找到了一個示例應用程序。

這裏是示例應用程序工作此功能。 (https://github.com/adithya321/Companion-for-Band/blob/dev/app/src/main/java/com/pimp/companionforband/activities/cloud/WebviewActivity.java

我從dev.app.microsoft.com

做出MS應用並取得密碼和註冊網絡平臺rediret URI(https://login.live.com/oauth20_desktop.srf

所以,我有我的CLIENT_ID,client_serect

在downloreUrl函數中,RequestMethod是「GET」。所以,我將它改爲「POST」。

private String downloadUrl(String url) throws IOException { 
    InputStream is = null; 
    try { 
     URL u = new URL(url); 
     HttpURLConnection conn = (HttpURLConnection) u.openConnection(); 
     conn.setReadTimeout(10000); 
     conn.setConnectTimeout(15000); 
     conn.setRequestMethod("GET"); 
     conn.setDoInput(true); 
     conn.connect(); 
     is = conn.getInputStream(); 

     return readIt(is, 9999); 
    } finally { 
     if (is != null) { 
      is.close(); 
     } 
    } 

,但它不工作這個程序。

我改變了使用HttpClient的訪問方法,而不是HttpURLConnection。

我發現我使用公共客戶端訪問MS雲api。

這裏是logcat的

02-10 15:30:51.533 29336-29639/com.example.user.bandsample D/WebviewActivity: executeClient: {"error":"invalid_request","error_description":"Public clients can't send a client secret."} 

刪除client_secret,我剛剛ACCESS_TOKEN無刷新令牌。

我不知道該怎麼辦。

回答

0

我解決了這個問題。

首先,如果您從應用程序中心製作移動應用程序,則不需要client_secret。

我將代碼URLConnection更改爲HttpClient。 URLConnection更簡單,但不起作用。

添加的gradle從這個Android的代碼使用的HttpClient

useLibrary 'org.apache.http.legacy' 

,並更改代碼Downloadurl新代碼

public String executeClient() { 
     ArrayList<NameValuePair> post = new ArrayList<NameValuePair>(); 
     post.add(new BasicNameValuePair("client_id", getString(R.string.client_id))); 
     post.add(new BasicNameValuePair("redirect_uri", r_uri)); 
     // post.add(new BasicNameValuePair("client_secret", getString(R.string.client_secret))); 
     post.add(new BasicNameValuePair("code", code)); 
     post.add(new BasicNameValuePair("grant_type", "authorization_code")); 

     // 연결 HttpClient 객체 생성 
     HttpClient client = new DefaultHttpClient(); 


     // 객체 연결 설정 부분, 연결 최대시간 등등 
     HttpParams params = client.getParams(); 
     HttpConnectionParams.setConnectionTimeout(params, 5000); 
     HttpConnectionParams.setSoTimeout(params, 5000); 

     // Post객체 생성 
     HttpPost httpPost = new HttpPost("https://login.live.com/oauth20_token.srf"); 
     HttpGet httpget = new HttpGet("https://login.live.com/oauth20_token.srf"); 
     try { 
      UrlEncodedFormEntity entity = new UrlEncodedFormEntity(post, "UTF-8"); 
      // UrlEncodedFormEntity entity = new UrlEncodedFormEntity(post, "UTF-8"); 
      httpPost.setEntity(entity); 
      // Log.d(TAG, "executeClient: " + entity); 
      HttpResponse hr = client.execute(httpPost); 
      //HttpResponse hr = client.execute(httpget); 
      HttpEntity resEntitiy = hr.getEntity(); 
      String x = EntityUtils.toString(resEntitiy); 
      Log.d(TAG, "executeClient: " + x); 
      return x; 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

,我用StringRequest代替JsonObjectRequset

StringRequest tokenRequest = new StringRequest(Request.Method.POST, uurl, 
      new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      Log.d("반응1", response.toString()); 
      JsonAccessTokenExtractor jate = new JsonAccessTokenExtractor(); 
      accessToken = jate.extractAccessToken(response.toString()); 
      refreshToken = jate.extractRefreshToken(response.toString()); 
      MainActivity.editor.putString("access_token", accessToken); 
      MainActivity.editor.putString("refresh_token", refreshToken); 
      MainActivity.editor.apply(); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

      Log.d("반응1", error.toString()); 
      Log.d("반응1", ""+error.networkResponse.headers.toString()); 
     } 
    }){ 

     @Override 
     protected Map<String, String> getParams() throws AuthFailureError { 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("client_id", getString(R.string.client_id)); 
      params.put("redirect_uri", r_uri); 
      params.put("refresh_token", MainActivity.sharedPreferences.getString("refresh_token", "hi")); 
      params.put("grant_type", "refresh_token"); 
      Log.d(TAG, params.toString()); 
      return params; 
     } 

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