【问题标题】:Can't send POST message over Https无法通过 Https 发送 POST 消息
【发布时间】:2016-02-25 05:30:54
【问题描述】:

我有一个简单的 android 应用程序,它需要向我的PHP 服务器发送一条消息,它会返回一些数据。我能够获取从服务器返回的数据,但我无法发送任何数据。这可能是一些愚蠢的事情,但我无法弄清楚。注意这里的url不是真正的url。

public void addUser(User user, String password) throws Exception {

    URL url = new URL("https://someuser.c9users.io/service.php");
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();

    // set Timeout and method
    conn.setRequestMethod("POST");
    conn.setReadTimeout(7000);
    conn.setConnectTimeout(7000);
    conn.setRequestProperty("op", "adduser");
    conn.setDoOutput(true);
    conn.setRequestProperty("username",user.getUserName());
    conn.setRequestProperty("email",user.getEmail());
    conn.setRequestProperty("password", password);
    if(user.getBirthDate() != null)
        conn.setRequestProperty("birthdate", user.getBirthDate().toString());
    if(user.getProfImage() != null)
        conn.setRequestProperty("profile_image", "some path to img");

    //conn.connect(); if I leave the code it does NoFileFoundException. why?
    InputStream is = conn.getInputStream();
    String result="";
    BufferedReader in = new BufferedReader(new InputStreamReader(is));
    String inputLine;
    while ((inputLine = in.readLine()) != null) {
        result += inputLine;
    }

}    

我的php代码:

function print_post_get() {
    echo "post&get vals: ";
    foreach($_POST as $key => $value) {
        echo $key.":".$value." \n";
    }
    foreach($_GET as $key => $value) {
        echo $key.":".$value." \n";
    }
}

//print all post and get
print_post_get();
//get method form post
if(empty($_POST['op']))
die('no operation?');

switch($_POST['op']) {

    case 'adduser':
        $retval = adduser();
        if($retval) //couldn't add user
            echo $retval;
        break;

    case 'removeuser': 
        $retval = removeuser();
        if($retval)
            echo $retval;
        break;
    case 'getuser':
        $retval = getuser();
        echo $retval;
        break;
    default:
        echo "unknow op.";
        break;
}

【问题讨论】:

  • 你的意思是说你可以做 GET 请求但不能 POST 数据?
  • 是否还要求您拥有任何客户端证书?
  • 您没有将数据添加到输出流中..
  • 使用PrintWriter.write方法发送到输出流。
  • 我可以发送 GET 或 POST

标签: java php android post https


【解决方案1】:

我最近遇到了类似的问题。我发现 setRequestProperty 添加到您的标题,而不是 POST 正文。但是

conn.setDoOutput(true)

允许您连接到

outStream = conn.getOutputStream()

现在您可以使用android.net.Uri.Builder 创建 POST 数据。

Uri.Builder builder = new Uri.Builder()
    .appendQueryParameter("username",user.getUserName())
    .appendQueryParameter("email",user.getEmail());

写入流,getEncodedQuery()

try (OutputStream outStream = conn.getOutputStream();
    BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(outStream, "UTF-8"))) {
    String query = builder.build().getEncodedQuery();
    writer.write(query);
 }

现在您可以使用conn 发布您的请求。

【讨论】:

  • 那么setRequestProperty 的意义何在? Android工作室说:cannot resolve method 'getEncodedQuery()'
  • @user2554080 确保在调用之前创建了构建器。就是这种方法-developer.android.com/reference/android/net/…。 setRequestProperty 只设置 header-fields,而 appendQueryParameter 可以用作 POST 负载。
  • 那么我需要setRequestProperty吗?
  • 。函数getEncodedQuery() 不是构建器类的一部分,如我的 Uri.Builder 文档中所示
猜你喜欢
  • 1970-01-01
  • 2016-12-08
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2020-05-04
相关资源
最近更新 更多