我是Android开发的新手,但我试图为Opencart做一个应用程序,允许用户进入他们自己的商店来管理它。
让我们谈谈。为了从商店获取信息,我创建了一个页面,其中所有信息都以XML格式呈现,因此想法是用户登录,然后重定向到此页面并使用http响应,解析xml和voilá!。
我已经有了xml解析器,但我在http连接方面遇到了一些困难。让我再解释一下:
基本上,要登录任何商店,您需要访问www.example.com/admin(我将使用我的测试在线地址查看是否有人能够帮助我),在这种情况下{{3} }。一旦我们到达页面,我们就会到达登录系统。登录系统使用post发送用户名:admin和密码:admin并重定向到http://www.onlineshop.davisanchezplaza.com/admin,一旦验证了你的身份,就会给你一个令牌(这里我开始遇到一些问题)。 http://onlineshop.davidsanchezplaza.com/admin/index.php?route=common/login。好吧,直到这里,我很好,实际上开发了一个可以做到这里的应用程序,实际上我可以“硬编码”从它发送给我的http响应中读取令牌(实际上并不是很好)。 这是我的第一个问题:如何从HTTP响应中获取令牌值?(现在,正如我所说,我只能通过读取所有响应来获取令牌,如果我们找到字符串令牌=,接下来的事情......不好)。
HttpClient httpClient = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), TIMEOUT_MS);
HttpConnectionParams.setSoTimeout(httpClient.getParams(), TIMEOUT_MS);
HttpPost httpPost = new HttpPost("http://onlineshop.davidsanchezplaza.com/admin/index.php?route=common/login");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("username", "admin"));
nameValuePairs.add(new BasicNameValuePair("password", "admin"));
try{
Log.d(DEBUG_TAG, "Try ");
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpClient.execute(httpPost);
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()), 8096);
Log.d(DEBUG_TAG, "br :" + br);
String line;
while ((line = br.readLine()) != null) {
Log.d(DEBUG_TAG, "br :" + line);
if(line.contains("token=")){
int index = line.indexOf("token=");
String aux = line.substring(index + "token=".length(), index + 32 + "token=".length());
token = aux; //Yes, I know, its not the best way.
break;
}
}
} catch (IOException e) {
Log.d(DEBUG_TAG, "Finally");
}
第二个问题,(以及更多重要),现在拥有令牌(在示例中为8e64583e003a4eedf54aa07cb3e48150),我需要转到route android / home其中是生成的xml信息。 (http://onlineshop.davidsanchezplaza.com/admin/index.php?route=common/home&token=8e64583e003a4eedf54aa07cb3e48150)。在我阅读时,在httpget中,我们可以设置参数,也可以直接发送url中已有的参数。是在这一步停止。也许是中国的互联网连接,也许(最肯定)我做错了什么。有时它只是超时连接,其他它只是将我发送回登录页面。
以下是我的代码(编辑:我是一个菜鸟,并没有创建httpclient来接收答案,抱歉!):
String s = "http://onlineshop.davidsanchezplaza.com/admin/index.php?route=common/home&token=";
String tot = s.concat(token);
HttpClient httpClient = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), TIMEOUT_MS);
HttpConnectionParams.setSoTimeout(httpClient.getParams(), TIMEOUT_MS);
HttpGet httpget = new HttpGet(tot);
try{
Log.d(DEBUG_TAG, "Try ");
HttpResponse response = httpClient.execute(httpget);
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()), 8096);
Log.d(DEBUG_TAG, "br :" + br);
} catch (IOException e) {
Log.d(DEBUG_TAG, "Finally");
}
我不需要有人告诉我该怎么做,只需要一些指导来解决问题,我非常感谢您提供的任何评论或帮助,或额外的文档:)。
作为奖励,如果有人可以向我提供有关如何测试http获取的更多详细信息,我将不胜感激,我只知道如何在网络浏览器中编写它,并且工作正常。
答案 0 :(得分:2)
自从我上次为Android做了一些事情以来已经有一段时间了,但这是我的建议:
从Android应用程序到OpenCart管理的登录目的我建议创建一个新的移动登录页面,例如而不是访问http://yourstore.com/admin/
,将您重定向到http://.../admin/index.php?route=common/login
创建您自己的操作,例如androidLogin()
在此控制器中admin/controller/common/login.php
,您将直接通过http://yourstore.com/admin/index.php?route=common/login/androidLogin
访问它。为什么要采取特殊措施?因为默认登录操作会将用户(使用普通浏览器)重定向到家中,同时设置安全令牌进入查询字符串部分中的URL。在您自己的操作中您不会重定向,而是使用包含此安全令牌的XML进行响应,以便您可以使用XML解析器轻松提取该令牌。
我无法准确解决第二个问题但是我记得我以不同的方式传递了一个查询字符串(现在我在互联网上找不到任何类似的解决方案)。
答案 1 :(得分:1)
第二个问题是我的5美分:
在浏览器中玩了一下之后我才意识到:
设置Cookie
如果您遗失了Cookie,您对...?route=android/home2&token=
的请求似乎会被拒绝。也就是说,您可能需要从第一个服务器响应中提取Cookie,并将其设置为手动(通过conn.setRequestProperty("Cookie", cookie);
或使用Android CookieManager
用户代理
某些服务器可能会因为您缺少&#34; User-Agent&#34;而拒绝您的请求。请求标头中的属性。为安全起见,您可以将其设置为conn.setRequestProperty("User-Agent", "Mozilla/5.0");
额外注意 - 我建议您也正确处理重定向,例如,当您POST
获得管理员/管理员凭据时,302 response
并重定向到...?route=common/home
页面
另外,在执行conn.setDoInput(true)
请求时,您不需要为UrlConnection
设置GET
。
希望有所帮助。
答案 2 :(得分:0)
在第二个问题中,我没有看到任何关于尝试的捕获声明,此捕获可能包含您需要了解的信息。
对于第一个问题,尝试将InputStreamReader转换为String,并将String用于a url构造函数,使用url(或者我现在不确定,并且无法测试)对象尝试.getQueryParameter(&#34;参数&#34;)。
答案 3 :(得分:0)
对于第二个问题,当我尝试使用您提供的令牌登录时,网页回复了无效令牌。您可以使用您提供的令牌登录吗?如果没有,请尝试获取新令牌。也许令牌已经过期了。