我能够生成访问令牌并存储它。但我无法使用此访问令牌获取数据。所以任何人都可以建议我如何在标题字段中设置此访问令牌。我在android中开发应用程序。所有当我请求配置文件端点时,它给我403错误。
我设置授权标头的代码如下: con.setRequestProperty(“授权”,“承载”+ accessstoken); 其中con是URLConnection对象。
除此之外,我需要为con对象设置哪些标头以成功请求。
任何类型的帮助将不胜感激。提前谢谢。
以下是获取个人资料数据的课程:
public class ProfileRequestActivity extends Activity {
MyUtility utility=new MyUtility(this);
String urlString="https://platform.lifelog.sonymobile.com/v1/users/me";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.d("pROFILE rEQUESt", "true");
getProfile();
}
public void getProfile()
{
RequestPackage pkg=new RequestPackage();
pkg.setUri(urlString);
pkg.setMethod("GET");
HTTPManager manager=new HTTPManager(pkg);
HttpURLConnection con=manager.doConnection();
Log.d("Access Token",utility.readPrefernce("access_token") );
con.setRequestProperty("Accept-Charset" , "utf-8");
con.setRequestProperty("Authorization", "Bearer "+utility.readPrefernce("access_token"));
con.setRequestProperty("Accept", "application/json");
//con.setDoInput(true);
//con.setDoOutput(true);
con.setRequestProperty("Accept-Encoding", "gzip");
//con.setRequestProperty("Content-Encoding", "gzip");
ExtractProfile task=new ExtractProfile();
task.execute(con);
}
public class ExtractProfile extends AsyncTask<HttpURLConnection, Void, Void>
{
@Override
protected Void doInBackground(HttpURLConnection... params)
{
int responseCode=0;
//String data="";
try {
responseCode = params[0].getResponseCode();
Map<String,List<String>> headerMap=params[0].getHeaderFields();
Log.d("MAP",headerMap.toString());
Log.d("profile response code",""+responseCode);
Log.d("Header:",params[0].getRequestProperty("Authorization"));
//data=params[0].getResponseMessage();
BufferedReader reader;
if (responseCode == HttpURLConnection.HTTP_OK)
reader = new BufferedReader(new InputStreamReader(params[0].getInputStream()));
else
reader = new BufferedReader(new InputStreamReader((params[0].getErrorStream())));
String line;
StringBuilder data=new StringBuilder();
while((line=reader.readLine())!=null)
{
data.append(line);
}
Log.d("data",data.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Log.d("Data",data);
return null;
}
}
}
Here is the helper class:
public class RequestPackage {
String uri="";
String method="GET";
Map<String,String> params=new HashMap<String, String>();
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public Map<String, String> getParams() {
return params;
}
public void setParams(Map<String, String> params) {
this.params = params;
}
public void setParam(String key,String value)
{
params.put(key, value);
}
public String getEncodedParams()
{
StringBuilder sb=new StringBuilder();
for(String key:params.keySet())
{
String value=null;
try {
value = URLEncoder.encode(params.get(key),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
params.put(key, value);
if(sb.length()>0)
{
sb.append("&");
//sb.append(key+"=");
}
sb.append(key+"="+value);
}
return sb.toString();
}
}
public class HTTPManager {
RequestPackage pkg;
public HTTPManager(RequestPackage p)
{
pkg=p;
}
public HttpURLConnection doConnection()
{
URL url;
HttpURLConnection con=null;
BufferedReader reader;
String uri=pkg.getUri();
Log.d("URI",uri);
try {
if(pkg.getMethod().equals("GET"))
{
if(pkg.getParams().size()!=0)
uri+="?"+pkg.getEncodedParams();
}
Log.d("Request Package URI",uri);
url = new URL(uri);
con=(HttpURLConnection) url.openConnection();
con.setRequestMethod(pkg.getMethod());
//con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
if(pkg.getMethod().equals("POST"))
{
con.setDoOutput(true);
con.setDoInput(true);
OutputStreamWriter writer=new OutputStreamWriter(con.getOutputStream());
// Log.d("ENCODED PARAMETER",uri+" "+pkg.getEncodedParams());
writer.write(pkg.getEncodedParams());
writer.flush();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("OUT CON",con.toString());
return con;
}
static public String readData(HttpURLConnection con)
{
// Log.d("IN CON",con.toString());
// String token = con.getHeaderFields();
// return token;
try {
//Log.d("Connection",con.toString());
//Log.d("Response",""+con.getResponseCode());
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuilder sb=new StringBuilder();
String line;
while((line=reader.readLine())!=null)
{
sb.append(line);
}
return sb.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
答案 0 :(得分:0)
好的我今天花了一些时间来查看你的代码。看来你有一些关键的东西不能成功地做oauth。
如果您使用oAuth库来处理艰苦的工作,实际上可能会更容易。这是我在网上找到的,但我相信还有其他人: https://github.com/wuman/android-oauth-client
答案 1 :(得分:0)
很抱歉延迟,但我相信我有一个答案。问题似乎在于您如何设置示波器。例如,你有这一行:
pkg.setParam("scope", MyOauth.SCOPE_PROFILE+"+"+MyOauth.SCOPE_LOCATION+"+"+MyOauth.SCOPE_ACTIVITY);
我认为它本身就可以找到,但是在将它发送到服务器之前你也会编码。现在,如果你只是删除加号,它应该适合你。像这样:
pkg.setParam("scope", MyOauth.SCOPE_PROFILE+" "+MyOauth.SCOPE_LOCATION+" "+MyOauth.SCOPE_ACTIVITY);
如果这不适合你,请告诉我!