我成功地使用这段代码通过GET方法发送带有一些参数的HTTP请求
void sendRequest(String request)
{
// i.e.: request = "http://example.com/index.php?param1=a¶m2=b¶m3=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),因为它们非常长。
我想添加一个额外的参数,该方法(即字符串httpMethod)。
我怎样才能尽可能少地更改上面的代码,以便能够通过GET或POST发送参数?
我希望情况会有所改变
connection.setRequestMethod("GET");
to
connection.setRequestMethod("POST");
可以完成这个任务,但是参数仍然通过GET方法发送。
HttpURLConnection有任何方法可以帮助吗?
有什么有用的Java构造吗?
任何帮助都将不胜感激。
我用Boann的答案创建了一个更灵活的查询字符串构建器,支持列表和数组,就像php的http_build_query方法一样:
public static byte[] httpBuildQueryString(Map<String, Object> postsData) throws UnsupportedEncodingException {
StringBuilder postData = new StringBuilder();
for (Map.Entry<String,Object> param : postsData.entrySet()) {
if (postData.length() != 0) postData.append('&');
Object value = param.getValue();
String key = param.getKey();
if(value instanceof Object[] || value instanceof List<?>)
{
int size = value instanceof Object[] ? ((Object[])value).length : ((List<?>)value).size();
for(int i = 0; i < size; i++)
{
Object val = value instanceof Object[] ? ((Object[])value)[i] : ((List<?>)value).get(i);
if(i>0) postData.append('&');
postData.append(URLEncoder.encode(key + "[" + i + "]", "UTF-8"));
postData.append('=');
postData.append(URLEncoder.encode(String.valueOf(val), "UTF-8"));
}
}
else
{
postData.append(URLEncoder.encode(key, "UTF-8"));
postData.append('=');
postData.append(URLEncoder.encode(String.valueOf(value), "UTF-8"));
}
}
return postData.toString().getBytes("UTF-8");
}