【问题标题】:Posting data in raw format to PHP file and getting response将原始格式的数据发布到 PHP 文件并获得响应
【发布时间】:2011-03-14 03:22:09
【问题描述】:

我正在制作一个 android 应用程序,我需要使用 post 数据将从数据中收集的一些数据发送到服务器 php 文件,并从 php 文件中获取回显文本并显示它。我有这种格式的帖子变量->“name=xyz&home=xyz”等等。我正在使用下面的类来发布,但是服务器上的 php 文件没有得到发布的 vars。有人可以告诉我有什么问题或任何其他方法可以做我想做的事情吗?

package xxx.xxx.xxx;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class NetUtil {
    public static String UrlToString(String targetURL, String urlParameters)
      {
        URL url;
        HttpURLConnection connection = null;  
        try {
          //Create connection
          url = new URL(targetURL);
          connection = (HttpURLConnection)url.openConnection();
          connection.setRequestMethod("POST");
          connection.setRequestProperty("Content-Type", 
               "application/x-www-form-urlencoded");

          connection.setRequestProperty("Content-Length", "" + 
                   Integer.toString(urlParameters.getBytes().length));
          connection.setRequestProperty("Content-Language", "en-US");  

          connection.setUseCaches (false);
          connection.setDoInput(true);
          connection.setDoOutput(true);

          //Send request
          DataOutputStream wr = new DataOutputStream (
                      connection.getOutputStream ());
          wr.write(urlParameters.getBytes("UTF-8"));
          wr.flush ();
          //Get Response    
          InputStream is = connection.getInputStream();
          BufferedReader rd = new BufferedReader(new InputStreamReader(is));
          String line;
          StringBuffer response = new StringBuffer(); 
          while((line = rd.readLine()) != null) {
            response.append(line);
            response.append('\r');
          }
          rd.close();
          return response.toString();

        } catch (Exception e) {

          e.printStackTrace();
          return null;

        } finally {

          if(connection != null) {
            connection.disconnect(); 
          }
        }
      }

}

我从 php 文件得到响应,但是 php 文件没有得到 post 数据。

【问题讨论】:

    标签: java php android post


    【解决方案1】:

    对于初学者来说,这个例子看起来不错。只会出现以下内容:

    connection.setRequestProperty("Content-Length", "" + 
        Integer.toString(urlParameters.getBytes().length));
    

    wr.write(urlParameters.getBytes("UTF-8"));
    

    首先,您使用平台默认编码将字符转换为字节。生成的长度不一定与使用 UTF-8 编码将字符转换为字节时的长度相同,就像您在编写请求正文时所做的那样。因此,Content-Length 标头有可能偏离 实际 内容长度。要解决此问题,您应该在两个调用中使用相同的字符集。

    但我相信 PHP 在解析请求正文时并不是真的那么严格,因此您在 PHP 端什么也得不到。 urlParameters 可能格式不正确。它们真的是 URL 编码的吗?

    不管怎样,您是否尝试过使用 Android 的内置 HttpClient API?应该很简单,如下:

    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost(targetURL);
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("name", "xyz"));
    params.add(new BasicNameValuePair("home", "xyz"));
    post.setEntity(new UrlEncodedFormEntity(params));
    HttpResponse response = client.execute(post);
    InputStream input = response.getEntity().getContent();
    // ...
    

    如果还不行,那么错误很可能在 PHP 端。

    【讨论】:

    • 感谢您的回复。我可以看到上面的代码有什么问题。关于 HttpClient API,我以获取数据格式收集的数据,如 "name=xyz&phone=abc&number=123" ,有没有办法将该格式与 httpclient api 一起使用或将该格式更改为名称值对。上面的 HttpClient API 将发布数据,但是我如何从 php 文件中获取作为字符串的回复?再次感谢:D
    • 以不同的方式收集它们。使用Map&lt;String, String&gt; 是最直接的选择。将它作为方法参数传递,然后循环遍历它,每次都将一个新的BasicNameValuePair 添加到列表中。至于阅读响应正文,请阅读我已经在代码示例中为您准备的input
    • 好的,这很清楚:) 感谢您的帮助。如果我遇到问题,我会尝试回复:D
    • @BalusC 我得到了其他所有东西,但是如何制作 Map 东西并将其传递给新方法?我对android和java完全陌生,所以如果可能的话,请给我一个示例代码。谢谢:D
    • 它是否有效?我不明白“我得到了其他一切”部分。至于地图,请阅读map tutorial 或提出新问题。
    猜你喜欢
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2012-02-22
    相关资源
    最近更新 更多