2014-04-08 127 views
1

虽然我不熟悉Android开发,但我试图为Opencart做一个应用程序,允许用户在自己的商店中输入以管理它。Http获取传递参数

让我们来谈谈。为了从商店获得信息,我创建了一个页面,其中所有信息都以XML格式显示,因此我们的想法是用户登录,然后重定向到此页面并使用http响应,解析xml和voilá!.

我已经有了XML解析器,但是Im在http连接上遇到了一些困难。让我再解释一下:

基本上,要登录任何商店,您需要访问www.example.com/admin(我将使用我的测试在线地址,以查看是否有人能够帮助我),在这种情况下为http://www.onlineshop.davisanchezplaza.com/admin。一旦我们到达页面,我们到达登录系统。登录系统使用post来发送用户名:admin和password:admin并重定向到http://onlineshop.davidsanchezplaza.com/admin/index.php?route=common/login,一旦它验证了你的身份,它会给你一个Token(这里我开始有一些问题)。 http://onlineshop.davidsanchezplaza.com/admin/index.php?route=common/home&token=8e64583e003a4eedf54aa07cb3e48150。那么,直到这里,我很好,实际上开发了一个应用程序,可以直到这里,实际上我可以“硬编码”从它发送给我的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),我需要去路线的Android /家中,生成的XML信息。 (http://onlineshop.davidsanchezplaza.com/admin/index.php?route=android/home2&token=8e64583e003a4eedf54aa07cb3e48150)。正如我正在阅读的那样,在httpget中,我们可以设置参数,或者直接使用已经在url内部的参数发送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 get的更多详细信息,我将不胜感激,我只知道如何在网页浏览器中编写它,并且工作正常。

回答

1

这是我5美分的第二个问题:

打了一下,与我实现了浏览器后:

  • 设置cookies
    你的请求...?route=android/home2&token=看来,如果你缺少被拒绝饼干。也就是说,你可能需要从第一台服务器响应中提取cookies和设置他们进一步要求手动(通过conn.setRequestProperty("Cookie", cookie);或采用Android CookieManager

  • 用户代理
    有些服务器可能会拒绝你的要求,只是因为你缺少“用户代理”的请求头财产为保险起见,你可以将其设置为类似conn.setRequestProperty("User-Agent", "Mozilla/5.0");

额外的说明 - 我建议你也正确处理重定向,例如当您POST你的管理/管理员c redentials你302 response并重定向到...?route=common/home

而且,你不需要设置conn.setDoInput(true)UrlConnection而做GET请求。

希望有所帮助。

0

我在第二个问题中没有看到任何catch语句,这个catch语句可能有你需要知道发生了什么的信息。

对于第一个问题尝试将InputStreamReader转换为一个字符串,并使用字符串的URL构造函数,url(或uri我不知道现在,无法测试它)对象尝试。 getQueryParameter( “参数”)。

+0

嗨,谢谢你的回应。我确实得到了第一个反应,虽然我用boucle做了,但我能找到这个令牌。为了您的观点,我不需要,因为捕获通常是例外情况,例如, IOException异常。 –

0

对于第二个问题,当我尝试使用您提供的令牌登录时,网页使用无效令牌进行回复。您可以使用您提供的令牌登录吗?如果没有,尝试获取新的令牌。也许令牌已经过期。

+0

您好,感谢您的快速响应。是的,尝试再次登录,传递和用户:管理员。它会生成一个新的令牌。对于标题,我尝试过**** // Header [] headers = response.getAllHeaders(); // \t为(报头报头:报头){// \t \t的System.out.println( “键:” + header.getName() // \t \t + “值:” + header.getValue() ); // \t} ****但我无法找到任何与令牌相关的东西。 :(。再次感谢:) –

+0

是的,你是对的,我的关于标题的错误:-( –

+1

你也可以尝试这个。在这行代码httpPost.setEntity(新的UrlEncodedFormEntity(nameValuePairs));请你也可以把这行httpPost .setHeader(“Connection”,“keep-alive”); –

2

这是因为我去年做了一件为Android一段时间,但这里是我的建议:

  1. 从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解析器轻松提取该令牌。

  2. 我无法完全解决第二个问题,但从我记得我传递查询字符串以不同的方式(现在我无法在互联网上找到任何类似的解决方案)

+0

很高兴你Shadyyx回答我的问题:)。好吧,这是我编辑我的帖子的事情,因为我已经可以从http获取响应。我的问题肯定是这一个。我用第一种方法(肯定)成功登录,获取令牌。问题是当我发送第二个请求与httpget到www.example.com/login?route=common/home&token=blaba他将我登出。事情是在网页浏览器真的没有铅,但在这里没有。对于新的动作,首先我不太了解,其次,我需要访问数据库,所以我需要使用opencart功能:(。 –

+0

我不知道什么是* pb *,但从来不知道。浏览器的原因是记录你出来的是你不共享会话,我真的很抱歉,我不能帮助更多,我的Android应用程序只与REST API进行通信,在那里我发送每个请求的登录凭证,在这里我想你需要使用像这样:http://stackoverflow.com/questions/11224454/android-share-session-between-webview-and-httpclient-不知道这是否可以帮助你更多... – shadyyx