Java 如何使用HttpUrlConnection正确进行POST?

Java 如何使用HttpUrlConnection正确进行POST?,java,android,post,httpurlconnection,Java,Android,Post,Httpurlconnection,我一直在寻找将数据发送到web表单或web服务(主要是php服务器)的方法,但是有很多不推荐的方法,我必须在表单中发布一个值,以及另一个更详细的web服务。 所以这里有三个问题: 我想知道是否可以在表单中发布数据并提交,如果可能的话,如何做到这一点。表单不是Web服务,而是用户输入()的表单 如何正确使用HttpUrlConnection调用Web服务(发布数据并获取响应),Web服务可以使用JSON或简单的2字符串值,如user和password 下面是我找到的代码,基本上: privat

我一直在寻找将数据发送到web表单或web服务(主要是php服务器)的方法,但是有很多不推荐的方法,我必须在表单中发布一个值,以及另一个更详细的web服务。 所以这里有三个问题:

  • 我想知道是否可以在表单中发布数据并提交,如果可能的话,如何做到这一点。表单不是Web服务,而是用户输入()的表单
  • 如何正确使用HttpUrlConnection调用Web服务(发布数据并获取响应),Web服务可以使用JSON或简单的2字符串值,如user和password
下面是我找到的代码,基本上:

private class PostTask extends AsyncTask<String, Void, Boolean> {

    @Override
    protected Boolean doInBackground(String... params) {
        HttpURLConnection conn=null;
        try {
            URL url = new URL(params[0]);
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            //conn.setReadTimeout(10000);
            //conn.setConnectTimeout(15000);
            //conn.setDoInput(true);
            String body = "4";
            conn.connect();
            OutputStream output = new BufferedOutputStream(conn.getOutputStream());
            output.write(body.getBytes());
            output.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            assert conn != null;
            conn.disconnect();
        }
        return true;
    }
}
私有类PostTask扩展了AsyncTask{
@凌驾
受保护的布尔doInBackground(字符串…参数){
HttpURLConnection conn=null;
试一试{
URL=新URL(参数[0]);
conn=(HttpURLConnection)url.openConnection();
连接设置输出(真);
conn.setRequestMethod(“POST”);
//连接设置读取超时(10000);
//连接设置连接超时(15000);
//conn.setDoInput(真);
字符串体=“4”;
连接();
OutputStream输出=新的BufferedOutputStream(conn.getOutputStream());
output.write(body.getBytes());
output.flush();
}捕获(例外e){
e、 printStackTrace();
}最后{
断言连接!=null;
连接断开();
}
返回true;
}
}

是可以使用
HttpUrlConnection
以url
params
的形式从表单传递数据。 你差不多成功了

在GET请求中,参数作为URL的一部分发送

在POST请求中,参数作为请求主体发送, 在标题之后

方法是:

 public void sendForm(String formParam1, String formParam2, String formParam3){
    String urlParameters  = "param1="+formParam1+"&param2="+formParam2+"&param3="+formParam3;

    try {
        byte[] postData       = urlParameters.getBytes( StandardCharsets.UTF_8 );
        int    postDataLength = postData.length;
        String request        = "http://sicenet.com.mx/ws/index.php/inicio/editar_clave";
        URL    url            = new URL( request );
        HttpURLConnection conn= (HttpURLConnection) url.openConnection();
        conn.setDoOutput( true );
        conn.setInstanceFollowRedirects( false );
        conn.setRequestMethod( "POST" );
        conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty( "charset", "utf-8");
        conn.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
        conn.setUseCaches( false );

        try(DataOutputStream wr = new DataOutputStream( conn.getOutputStream())) {
            wr.write( postData );
        }

    }catch (Exception e){
        e.printStackTrace();
    }
}
没有测试它是否有效


在此

中找到“是”,可以使用
HttpUrlConnection
以url
params
的形式从表单传递数据。 你差不多成功了

在GET请求中,参数作为URL的一部分发送

在POST请求中,参数作为请求主体发送, 在标题之后

方法是:

 public void sendForm(String formParam1, String formParam2, String formParam3){
    String urlParameters  = "param1="+formParam1+"&param2="+formParam2+"&param3="+formParam3;

    try {
        byte[] postData       = urlParameters.getBytes( StandardCharsets.UTF_8 );
        int    postDataLength = postData.length;
        String request        = "http://sicenet.com.mx/ws/index.php/inicio/editar_clave";
        URL    url            = new URL( request );
        HttpURLConnection conn= (HttpURLConnection) url.openConnection();
        conn.setDoOutput( true );
        conn.setInstanceFollowRedirects( false );
        conn.setRequestMethod( "POST" );
        conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty( "charset", "utf-8");
        conn.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
        conn.setUseCaches( false );

        try(DataOutputStream wr = new DataOutputStream( conn.getOutputStream())) {
            wr.write( postData );
        }

    }catch (Exception e){
        e.printStackTrace();
    }
}
没有测试它是否有效


在此

中找到您是否检查了
改装
?我认为这是管理服务器调用最简单的方法,比如POST、PUT、DELETE,而且它已经有了Http类的抽象。不,我不是,是一个库吗?是的,是的。很容易对您的服务器进行这些调用,并且它基于RestFULL模式,您将在internet上找到许多示例。你可以从源代码处查看。是的,但是我不能编译另一个库,特别是如果我可以不出这么多问题地编译它,我已经编译了5个库,如果我想使用另一个库,我必须启用multidexI。下面我回答说,但是我认为使用这种传统的联网方法会让你有点头疼。我建议你检查一下改型,OkHttp来管理连接,希望能有所帮助。考虑一下最小化您的依赖性,因为multidex,因为我提到的那些lib非常简单,并且具有较小的大小。您是否检查了
改装
?我认为这是管理服务器调用最简单的方法,比如POST、PUT、DELETE,而且它已经有了Http类的抽象。不,我不是,是一个库吗?是的,是的。很容易对您的服务器进行这些调用,并且它基于RestFULL模式,您将在internet上找到许多示例。你可以从源代码处查看。是的,但是我不能编译另一个库,特别是如果我可以不出这么多问题地编译它,我已经编译了5个库,如果我想使用另一个库,我必须启用multidexI。下面我回答说,但是我认为使用这种传统的联网方法会让你有点头疼。我建议你检查一下改型,OkHttp来管理连接,希望能有所帮助。考虑一下最小化依赖关系,因为多重索引,因为我提到的那些lib非常简单,大小也更小。@BrandonZamudio你可以还是不能?如果你不能,你会遇到什么问题?更新您的帖子并显示您用于接收数据的php代码。@BrandonZamudio您可以还是不能?如果你不能,你会遇到什么问题?更新您的帖子并显示用于接收数据的php代码。