【问题标题】:Http get pass parametersHttp获取传参
【发布时间】:2014-05-21 02:22:52
【问题描述】:

我是 Android 开发的新手,但我正在尝试为 Opencart 做一个应用程序,以允许用户进入他们自己的商店来管理它。

让我们进入正题。为了从商店获取信息,我创建了一个页面,其中所有信息都以 XML 形式呈现,因此想法是用户登录,然后重定向到该页面并使用 http 响应,解析 xml 和瞧!

我已经有了 xml 解析器,但我在使用 http 连接时遇到了一些困难。让我再解释一下:

基本上,要登录任何商店,您需要访问 www.example.com/admin(我将使用我的测试在线地址来查看是否有人能够帮助我),在这种情况下为 http://www.onlineshop.davisanchezplaza.com/admin 。一旦我们到达页面,我们就会到达登录系统。登录系统使用 post 发送用户名:admin 和密码: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 响应中读取令牌(实际上不是很好)。 这是我的第一个问题:如何从 HTTPresponse 中获取令牌值?(现在,正如我所说,我只能通过读取所有响应来获取令牌,如果我们找到字符串令牌=,接下来会发生什么……不好)。

    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=android/home2&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 get 的详细信息,我将不胜感激,我只知道如何在网络浏览器中编写它,并且工作正常。

【问题讨论】:

    标签: android http opencart


    【解决方案1】:

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

    对于第一个问题,尝试将 InputStreamReader 转换为 String,并将 String 用于 url 构造函数,使用 url(或 uri 我现在不确定,无法测试)对象尝试 .getQueryParameter("parameter")。

    【讨论】:

    • 您好,也感谢您的回复。我实际上得到了第一个响应,虽然我用 while boucle 做,但我能找到令牌。对于您关于捕获的观点,我不需要,因为捕获通常用于异常,例如IO异常。
    【解决方案2】:

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

    【讨论】:

    • 您好,感谢您的快速响应。是的,尝试再次登录,通过和用户:admin。它将为您生成一个新令牌。对于标题,我尝试了 ****//Header[] headers = response.getAllHeaders(); // for (Header header : headers) { // System.out.println("Key : " + header.getName() // + " ,Value : " + header.getValue()); // } **** 但我找不到任何与令牌相关的内容。 :(。再次感谢 :)
    • 是的,你是对的,我对标题的错误:-(
    • 你也可以试试这个。在这行代码之后 httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));你能不能也把这行 httpPost.setHeader("Connection", "keep-alive");
    • 你好 Periklis,是的,我试过了,还是同样的问题。我真的认为这会有所帮助:(。哈哈哈,无论如何,非常感谢你的兴趣和时间:)
    【解决方案3】:

    我上次为 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. 我无法准确解决第二个问题,但据我所知,我以不同的方式传递了一个查询字符串(现在我在互联网上找不到任何类似的解决方案)。

    【讨论】:

    • 很高兴你,Shadyyx,回答我的问题 :)。好的,就是这样,我正在编辑我的帖子,因为我已经可以从 http Get 获得响应。我的问题肯定是这个。我使用第一种方法(肯定)成功登录,获取令牌。问题是当我使用 httpget 向 www.example.com/login?route=common/home&token=blaba 发送第二个请求时,他正在让我退出。事情在 webbrowser 中确实可以在没有 pb 的情况下工作,但这里没有。对于新动作,首先我不太了解,其次我需要访问数据库,所以我需要使用opencart函数:(.
    • 我不知道什么是pb,但没关系。浏览器将您注销的原因是您不共享会话。真的很抱歉,我无法提供更多帮助,我的 Android 应用程序仅与 REST API 通信,我在其中为每个请求发送登录凭据。在这里我认为你需要使用这样的东西:stackoverflow.com/questions/11224454/… - 不确定这是否可以帮助你更多......
    【解决方案4】:

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

    在浏览器上玩了一会儿后,我意识到:

    • 设置 Cookies
      如果您缺少 cookie,您对 ...?route=android/home2&amp;token= 的请求似乎被拒绝。也就是说,您可能需要从第一个服务器响应中提取 cookie 并将它们设置为手动(通过 conn.setRequestProperty("Cookie", cookie); 或使用 Android CookieManager

    • 用户代理
      某些服务器可能会因为您在请求标头中缺少“User-Agent”属性而拒绝您的请求。为了安全起见,您可以将其设置为 conn.setRequestProperty("User-Agent", "Mozilla/5.0");

    额外说明 - 我建议您也正确处理重定向,例如,当您 POST 您的管理员/管理员凭据时,您将获得 302 response 并重定向到 ...?route=common/home 页面

    另外,在进行GET 请求时,您不需要为UrlConnection 设置conn.setDoInput(true)

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 2022-12-19
      相关资源
      最近更新 更多