【问题标题】:Submitting an HTML form in Android without WebView在没有 WebView 的情况下在 Android 中提交 HTML 表单
【发布时间】:2023-03-13 11:37:02
【问题描述】:

我的任务是使用来自

的数据在 Android 中开发一个非常简单的天气应用程序

http://forecast.weather.gov/zipcity.php

这将是我的第一个真正的 Android 应用程序,我唯一的其他体验是观看/阅读许多入门教程。

要提供应用程序的一些背景信息,它只需要有一个 Activity,它是 供用户输入城市、州组合或只是邮政编码的文本字段。然后需要将其提交到网站的(上面列出的)表单。

提交后,我的应用需要检索响应发送的页面并将其显示在一个简单的布局中(可能是一周中几天的 listView)。

我的第一个问题是,我将如何向上述网站的表单提交文本输入?我是否必须知道表单字段的名称才能准确提交给它?

一般来说,我应该如何开始这个过程?


编辑版本:

使用此代码:

HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost("http://forecast.weather.gov/zipcity.php?inputstring=04419");

    HttpResponse httpResp;

    try {
        httpResp = httpClient.execute(post);
        StatusLine status = httpResp.getStatusLine();
        Toast.makeText(getApplicationContext(), status.getStatusCode(), Toast.LENGTH_SHORT).show();


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

我得到一个:

10-26 15:29:56.686: DEBUG/SntpClient(59): request time failed: java.net.SocketException: Address family not supported by protocol

调试视图中的错误。这个错误是否相关?我使用 toast 来测试这个 http 交互是否成功是合理的吗?

【问题讨论】:

    标签: html android http forms post


    【解决方案1】:

    当你想查看一个post请求在传递时使用了Firefox + tamperdata,那么你可以看看如何使用webservice。

    我看了看,我搜索了“33129”,当您在左侧框中输入文本开始搜索时,它只需输入 2 个参数:

    inputstring = "33129"
    Go2 = "Go"
    

    这是一种方法,另一方面,一旦请求完成,它就会将其转换为另一个请求,那就更具体了。您可以按市州或邮编搜索,不能同时按两者。

    如果您使用 zip 请求,您将被重定向到:

    http://forecast.weather.gov/MapClick.php?CityName=Miami&state=FL&site=MFL&lat=25.77&lon=-80.2
    

    所以那里可能正在进行重定向。

    您将不得不仔细研究如何使用它。

    现在,要在 android 中执行发布请求,请使用这样的名称值对。

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("inputstring","33129));
    

    Ramp 的回答显示了其余部分。

    此外,所有通信都应在不是主 UI 线程的线程上完成,否则您将收到 ANR 错误。

    【讨论】:

      【解决方案2】:

      当我查看您的网址时,我输入了城市和州。这是它在 HTTP POST 中生成的网址:

      http://forecast.weather.gov/MapClick.php?CityName=Edison&state=NJ&site=PHI&textField1=40.5288&textField2=-74.3693

      因此,您将使用 CityName 和状态 URL 参数执行 HTTP POST。如果你在你的 android 程序中使用 apache HttpClient 将会是这样的: (我猜也可以使用 HTTP GET)

      HttpPost post = new HttpPost(url);//construct url with cityName and State HttpResponse httpResp = httpClient.execute(post); StatusLine status = httpResp.getStatusLine();

      希望这会有所帮助。

      【讨论】:

      【解决方案3】:

      类似这样的:

              HttpClient hc = new DefaultHttpClient();
              List<NameValuePair> l = new ArrayList<NameValuePair>(6);
              l.add(new BasicNameValuePair("fieldname", "fieldvalue"));
                   //More fields...
                   HttpPost pr = new HttpPost(TheURL);
              pr.setEntity(new UrlEncodedFormEntity(l, "the-proper-encoding"));
              HttpResponse Resp = hc.execute(pr);
              if(Resp.getStatusLine().getStatusCode() != 200)
                       //Fail...
      

      【讨论】:

        猜你喜欢
        • 2011-12-04
        • 2021-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 2016-08-29
        • 1970-01-01
        相关资源
        最近更新 更多