我成功地使用这段代码通过GET方法发送了HTTP个带有一些参数的请求

void sendRequest(String request)
{
    // i.e.: request = "http://example.com/index.php?param1=a&param2=b&param3=c";
    URL url = new URL(request); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();           
    connection.setDoOutput(true); 
    connection.setInstanceFollowRedirects(false); 
    connection.setRequestMethod("GET"); 
    connection.setRequestProperty("Content-Type", "text/plain"); 
    connection.setRequestProperty("charset", "utf-8");
    connection.connect();
}

现在我可能需要通过POST方法发送参数(即param1、param2、param3),因为它们非常长. 我在考虑向该方法添加一个额外的参数(即string httpMethod).

如何尽可能少地更改上述代码,以便能够通过GETPOST发送参数?

我希望这会改变

connection.setRequestMethod("GET");

connection.setRequestMethod("POST");

本来可以做到这一点,但参数仍然通过GET方法发送.

HttpURLConnection有没有什么方法可以帮上忙?

任何帮助都将不胜感激.

推荐答案

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

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

要使用HttpURLConnection进行POST,需要在打开连接后将参数写入连接.

下面的代码应该可以让您开始:

String urlParameters  = "param1=a&param2=b&param3=c";
byte[] postData       = urlParameters.getBytes( StandardCharsets.UTF_8 );
int    postDataLength = postData.length;
String request        = "http://example.com/index.php";
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 );
}

Java相关问答推荐

Spring Jpa findById会导致StackOverFlow错误,但其他查询没有问题

CriteriaQuery with max

空手道比赛条件

SQlite for Android无法使用json_group_array/json_object

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

使用@MappdSuperClass扩展ParentClass&Won t继承ParentClass属性

Java中如何根据Font.canDisplay方法对字符串进行分段

try 创建一个对象,使用它,然后使用一条语句将其存储为列表

如何创建一个2d自上而下的移动系统,其中移动,同时持有两个关键是可能的处理?

Spring Boot Maven包

为什么S的文档中说常量方法句柄不能在类的常量池中表示?

当Volatile关键字真的是必要的时候?

为什么我的回收视图会显示重复的列表?

如何在构建Gradle项目时排除com.google.guava依赖项的一个变体

buildDir:File!&#的getter解决方案是什么?39.被抛弃

持续时间--为什么在秒为负数的情况下还要做额外的工作?

为什么JavaFX MediaPlayer音频播放在Windows和Mac上运行良好,但在Linux(POPOS/Ubuntu)上却有问题?

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

原始和参数化之间的差异调用orElseGet时可选(供应商)

@此处不能应用可为null的批注