如何在Android中使用OAUTH2发送HTTP请求?

时间:2018-03-04 14:36:51

标签: json android-asynctask oauth-2.0 fitbit

我正在尝试通过连接Fitbit API从我的帐户中检索数据。我有我的应用程序返回访问令牌我需要使HTTP请求返回JSON但我尝试的任何东西,它返回一个错误。我有两个活动 - MainActivity.java和TestActivity.java

在MainActivity.java中,我只是打开Chrome自定义标签,将用户定向到Fitbit身份验证(登录)页面。用户输入详细信息后,将根据Fitbit API文档将其重定向回TestActivity.java。我正在打印Acess Token,它向我证明它正在连接到API。

我需要做的是发出HTTP请求以JSON格式返回睡眠数据。我知道如何用Java实现它,但我不确定如何使用AsyncTask方式在Android中完成它。任何帮助表示赞赏!

public class TestActivity extends AppCompatActivity {

String string;
String token;


@Override
protected void onNewIntent(Intent intent) {
    string = intent.getDataString();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    onNewIntent(getIntent());
    //Toast.makeText(TestActivity.this, string , Toast.LENGTH_LONG).show();
    Log.e("TAG", string);
    Log.e("TAG", string.substring(string.indexOf("&access_token")+14));

    token = string.substring(string.indexOf("&access_token")+14);

    Context context = getApplicationContext();
    Toast toast = Toast.makeText(context,"Access Token: "+ token,Toast.LENGTH_LONG );

    Log.i("TAG", "Access Token: "+ token);



    new JSONTask().execute("https://api.fitbit.com/1.2/user/-/sleep/date/2018-01-30.json");






}

public class JSONTask extends AsyncTask<String,String,String>
{

    @Override
    protected String doInBackground(String... params) {

        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try
        {
            URL url = new URL(params[0]);
            connection.setRequestMethod("GET");
            connection.setRequestProperty("Authorization", "Bearer " + token);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            InputStream stream = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(stream));

            StringBuffer buffer = new StringBuffer();

            String line = "";

            while((line = reader.readLine()) !=null)
            {
                buffer.append(line);
            }

            return buffer.toString();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;

    }

    @Override
    protected void onPostExecute(String s)
    {
        super.onPostExecute(s);
        Log.i("TAG", s);
    }
}

2 个答案:

答案 0 :(得分:0)

我最终在这个问题上取得了突破。我发现我正在错误地提取访问令牌。所以,而不是做以下事情:

 token = string.substring(string.indexOf("&access_token")+14);

我不得不使用它:

token = string.substring(string.indexOf("&access_token")+36,308);

然后,应用程序能够向Fitbit API发出必要的HTTP请求,该API返回了我需要的JSON数据。

答案 1 :(得分:0)

应更改一个代码顺序以防止FC。

connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Authorization", "Bearer " + token);