Java-отправка параметров HTTP с помощью метода POST легко
я успешно использую этот код, чтобы отправить HTTP
запросы с некоторыми параметрами через GET
метод
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();
}
теперь мне может понадобиться отправить параметры (т. е. param1, param2, param3) через POST
метод, потому что они очень долго.
Я думал добавить дополнительный параметр к этому методу (т. е. String httpMethod).
как я могу изменить приведенный выше код как можно меньше, чтобы иметь возможность отправлять параметры либо через GET
или POST
?
Я надеюсь, что меняется
connection.setRequestMethod("GET");
до
connection.setRequestMethod("POST");
сделал бы трюк, но параметры по-прежнему отправляются с помощью метода GET.
и HttpURLConnection
есть какой-нибудь метод, который поможет?
Есть ли какая-нибудь полезная конструкция Java?
любая помощь была бы очень признательна.
15 ответов:
в запросе GET параметры передаются в URL.
в запросе POST параметры отправляются как тело запроса, после заголовков.
чтобы сделать сообщение с HttpURLConnection, вам нужно записать параметры в соединение после открытия соединения.
этот код должен помочь вам начать:
String urlParameters = "param1=a¶m2=b¶m3=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 ); }
вот простой пример, который отправляет форму, а затем сбрасывает страницу результатов в
System.out
. Измените URL и параметры POST соответствующим образом, конечно:import java.io.*; import java.net.*; import java.util.*; class Test { public static void main(String[] args) throws Exception { URL url = new URL("http://example.net/new-message.php"); Map<String,Object> params = new LinkedHashMap<>(); params.put("name", "Freddie the Fish"); params.put("email", "fishie@seamail.example.com"); params.put("reply_to_thread", 10394); params.put("message", "Shark attacks in Botany Bay have gotten out of control. We need more defensive dolphins to protect the schools here, but Mayor Porpoise is too busy stuffing his snout with lobsters. He's so shellfish."); StringBuilder postData = new StringBuilder(); for (Map.Entry<String,Object> param : params.entrySet()) { if (postData.length() != 0) postData.append('&'); postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); postData.append('='); postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); } byte[] postDataBytes = postData.toString().getBytes("UTF-8"); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); conn.setDoOutput(true); conn.getOutputStream().write(postDataBytes); Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); for (int c; (c = in.read()) >= 0;) System.out.print((char)c); } }
если вы хотите получить результат в виде
String
вместо того, чтобы напрямую распечатать сделать:StringBuilder sb = new StringBuilder(); for (int c; (c = in.read()) >= 0;) sb.append((char)c); String response = sb.toString();
Я не мог получить Алан на самом деле сделать сообщение, так что я закончил с этим:
String urlParameters = "param1=a¶m2=b¶m3=c"; URL url = new URL("http://example.com/index.php"); URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream()); writer.write(urlParameters); writer.flush(); String line; BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); while ((line = reader.readLine()) != null) { System.out.println(line); } writer.close(); reader.close();
найти
HttpURLConnection
очень громоздко использовать. И вы должны написать много шаблонного, подверженного ошибкам кода. Мне нужна была легкая обертка для моих проектов Android и вышла с библиотекой, которую вы также можете использовать:DavidWebb.приведенный выше пример можно записать так:
Webb webb = Webb.create(); webb.post("http://example.com/index.php") .param("param1", "a") .param("param2", "b") .param("param3", "c") .ensureSuccess() .asVoid();
Вы можете найти список альтернативных библиотек по указанной ссылке.
Я вижу, что некоторые другие ответы дали альтернативу, я лично думаю, что интуитивно ты все делаешь правильно ;). Извините, в devoxx, где несколько ораторов разглагольствовали о таких вещах.
вот почему я лично использую Apache HTTPClient/HttpCore библиотеки для выполнения такого рода работы я считаю, что их API проще в использовании, чем собственная поддержка HTTP Java. Конечно, YMMV!
import java.net.*; public class Demo{ public static void main(){ String data = "data=Hello+World!"; URL url = new URL("http://localhost:8084/WebListenerServer/webListener"); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("POST"); con.setDoOutput(true); con.getOutputStream().write(data.getBytes("UTF-8")); con.getInputStream(); } }
Я прочитал выше ответы и создал служебный класс для упрощения HTTP-запроса. я надеюсь, что это поможет вам.
Вызов Метода
// send params with Hash Map HashMap<String, String> params = new HashMap<String, String>(); params.put("email","me@example.com"); params.put("password","12345"); //server url String url = "http://www.example.com"; // static class "HttpUtility" with static method "newRequest(url,method,callback)" HttpUtility.newRequest(url,HttpUtility.METHOD_POST,params, new HttpUtility.Callback() { @Override public void OnSuccess(String response) { // on success System.out.println("Server OnSuccess response="+response); } @Override public void OnError(int status_code, String message) { // on error System.out.println("Server OnError status_code="+status_code+" message="+message); } });
Служебный Класс
import java.io.*; import java.net.*; import java.util.HashMap; import java.util.Map; import static java.net.HttpURLConnection.HTTP_OK; public class HttpUtility { public static final int METHOD_GET = 0; // METHOD GET public static final int METHOD_POST = 1; // METHOD POST // Callback interface public interface Callback { // abstract methods public void OnSuccess(String response); public void OnError(int status_code, String message); } // static method public static void newRequest(String web_url, int method, HashMap < String, String > params, Callback callback) { // thread for handling async task new Thread(new Runnable() { @Override public void run() { try { String url = web_url; // write GET params,append with url if (method == METHOD_GET && params != null) { for (Map.Entry < String, String > item: params.entrySet()) { String key = URLEncoder.encode(item.getKey(), "UTF-8"); String value = URLEncoder.encode(item.getValue(), "UTF-8"); if (!url.contains("?")) { url += "?" + key + "=" + value; } else { url += "&" + key + "=" + value; } } } HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection(); urlConnection.setDoOutput(true); // write POST params urlConnection.setUseCaches(false); urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // handle url encoded form data urlConnection.setRequestProperty("charset", "utf-8"); if (method == METHOD_GET) { urlConnection.setRequestMethod("GET"); } else if (method == METHOD_POST) { urlConnection.setRequestMethod("POST"); } //write POST data if (method == METHOD_POST && params != null) { StringBuilder postData = new StringBuilder(); for (Map.Entry < String, String > item: params.entrySet()) { if (postData.length() != 0) postData.append('&'); postData.append(URLEncoder.encode(item.getKey(), "UTF-8")); postData.append('='); postData.append(URLEncoder.encode(String.valueOf(item.getValue()), "UTF-8")); } byte[] postDataBytes = postData.toString().getBytes("UTF-8"); urlConnection.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); urlConnection.getOutputStream().write(postDataBytes); } // server response code int responseCode = urlConnection.getResponseCode(); if (responseCode == HTTP_OK && callback != null) { BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } // callback success callback.OnSuccess(response.toString()); reader.close(); // close BufferReader } else if (callback != null) { // callback error callback.OnError(responseCode, urlConnection.getResponseMessage()); } urlConnection.disconnect(); // disconnect connection } catch (IOException e) { e.printStackTrace(); if (callback != null) { // callback error callback.OnError(500, e.getLocalizedMessage()); } } } }).start(); // start thread } }
у меня была та же проблема. Я хотел отправить данные по почте. Я использовал следующий код:
URL url = new URL("http://example.com/getval.php"); Map<String,Object> params = new LinkedHashMap<>(); params.put("param1", param1); params.put("param2", param2); StringBuilder postData = new StringBuilder(); for (Map.Entry<String,Object> param : params.entrySet()) { if (postData.length() != 0) postData.append('&'); postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); postData.append('='); postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); } String urlParameters = postData.toString(); URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream()); writer.write(urlParameters); writer.flush(); String result = ""; String line; BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); while ((line = reader.readLine()) != null) { result += line; } writer.close(); reader.close() System.out.println(result);
я использовал Jsoup для парсинга:
Document doc = Jsoup.parseBodyFragment(value); Iterator<Element> opts = doc.select("option").iterator(); for (;opts.hasNext();) { Element item = opts.next(); if (item.hasAttr("value")) { System.out.println(item.attr("value")); } }
попробуйте такой шаблон:
public static PricesResponse getResponse(EventRequestRaw request) { // String urlParameters = "param1=a¶m2=b¶m3=c"; String urlParameters = Piping.serialize(request); HttpURLConnection conn = RestClient.getPOSTConnection(endPoint, urlParameters); PricesResponse response = null; try { // POST OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream()); writer.write(urlParameters); writer.flush(); // RESPONSE BufferedReader reader = new BufferedReader(new InputStreamReader((conn.getInputStream()), StandardCharsets.UTF_8)); String json = Buffering.getString(reader); response = (PricesResponse) Piping.deserialize(json, PricesResponse.class); writer.close(); reader.close(); } catch (Exception e) { e.printStackTrace(); } conn.disconnect(); System.out.println("PricesClient: " + response.toString()); return response; } public static HttpURLConnection getPOSTConnection(String endPoint, String urlParameters) { return RestClient.getConnection(endPoint, "POST", urlParameters); } public static HttpURLConnection getConnection(String endPoint, String method, String urlParameters) { System.out.println("ENDPOINT " + endPoint + " METHOD " + method); HttpURLConnection conn = null; try { URL url = new URL(endPoint); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod(method); conn.setDoOutput(true); conn.setRequestProperty("Content-Type", "text/plain"); } catch (IOException e) { e.printStackTrace(); } return conn; }
вот я отправил jsonobject в качестве параметра //jsonobject={"имя":"Люцифер","перевал":"Азбука"}//надо установить до начала использования = "http://192.168.100.12/testing " / / host=192.168.100.12
public static String getJson(String serverUrl,String host,String jsonobject){ StringBuilder sb = new StringBuilder(); String http = serverUrl; HttpURLConnection urlConnection = null; try { URL url = new URL(http); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setDoOutput(true); urlConnection.setRequestMethod("POST"); urlConnection.setUseCaches(false); urlConnection.setConnectTimeout(50000); urlConnection.setReadTimeout(50000); urlConnection.setRequestProperty("Content-Type", "application/json"); urlConnection.setRequestProperty("Host", host); urlConnection.connect(); //You Can also Create JSONObject here OutputStreamWriter out = new OutputStreamWriter(urlConnection.getOutputStream()); out.write(jsonobject);// here i sent the parameter out.close(); int HttpResult = urlConnection.getResponseCode(); if (HttpResult == HttpURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader( urlConnection.getInputStream(), "utf-8")); String line = null; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } br.close(); Log.e("new Test", "" + sb.toString()); return sb.toString(); } else { Log.e(" ", "" + urlConnection.getResponseMessage()); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } finally { if (urlConnection != null) urlConnection.disconnect(); } return null; }
Я очень рекомендую http-запрос построен на Apache http api.
для вашего случая вы можете увидеть пример:
private static final HttpRequest<String.class> HTTP_REQUEST = HttpRequestBuilder.createPost("http://example.com/index.php", String.class) .responseDeserializer(ResponseDeserializer.ignorableDeserializer()) .build(); public void sendRequest(String request){ String parameters = request.split("\?")[1]; ResponseHandler<String> responseHandler = HTTP_REQUEST.executeWithQuery(parameters); System.out.println(responseHandler.getStatusCode()); System.out.println(responseHandler.get()); //prints response body }
Если вас не интересует тело ответа
private static final HttpRequest<?> HTTP_REQUEST = HttpRequestBuilder.createPost("http://example.com/index.php").build(); public void sendRequest(String request){ ResponseHandler<String> responseHandler = HTTP_REQUEST.executeWithQuery(parameters); }
для общей отправки почтового запроса с http-запрос: прочитайте документацию и посмотрите мои ответы HTTP POST запрос со строкой JSON в JAVA,отправка HTTP POST запроса на Java,HTTP POST с использованием JSON in Java
Привет pls используйте этот класс, чтобы улучшить свой метод post
public static JSONObject doPostRequest(HashMap<String, String> data, String url) { try { RequestBody requestBody; MultipartBuilder mBuilder = new MultipartBuilder().type(MultipartBuilder.FORM); if (data != null) { for (String key : data.keySet()) { String value = data.get(key); Utility.printLog("Key Values", key + "-----------------" + value); mBuilder.addFormDataPart(key, value); } } else { mBuilder.addFormDataPart("temp", "temp"); } requestBody = mBuilder.build(); Request request = new Request.Builder() .url(url) .post(requestBody) .build(); OkHttpClient client = new OkHttpClient(); Response response = client.newCall(request).execute(); String responseBody = response.body().string(); Utility.printLog("URL", url); Utility.printLog("Response", responseBody); return new JSONObject(responseBody); } catch (UnknownHostException | UnsupportedEncodingException e) { JSONObject jsonObject=new JSONObject(); try { jsonObject.put("status","false"); jsonObject.put("message",e.getLocalizedMessage()); } catch (JSONException e1) { e1.printStackTrace(); } Log.e(TAG, "Error: " + e.getLocalizedMessage()); } catch (Exception e) { e.printStackTrace(); JSONObject jsonObject=new JSONObject(); try { jsonObject.put("status","false"); jsonObject.put("message",e.getLocalizedMessage()); } catch (JSONException e1) { e1.printStackTrace(); } Log.e(TAG, "Other Error: " + e.getLocalizedMessage()); } return null; }
Я взял ответ Боанна и использовал его для создания более гибкого построителя строк запроса, который поддерживает списки и массивы, как и метод http_build_query php:
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"); }
GET и POST метод устанавливается следующим образом... Два типа для вызова api 1) get () и 2) post (). get() метод для получения значения из массива api json для получения значения & post () метод используется в нашей записи данных в url и получить ответ.
public class HttpClientForExample { private final String USER_AGENT = "Mozilla/5.0"; public static void main(String[] args) throws Exception { HttpClientExample http = new HttpClientExample(); System.out.println("Testing 1 - Send Http GET request"); http.sendGet(); System.out.println("\nTesting 2 - Send Http POST request"); http.sendPost(); } // HTTP GET request private void sendGet() throws Exception { String url = "http://www.google.com/search?q=developer"; HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(url); // add request header request.addHeader("User-Agent", USER_AGENT); HttpResponse response = client.execute(request); System.out.println("\nSending 'GET' request to URL : " + url); System.out.println("Response Code : " + response.getStatusLine().getStatusCode()); BufferedReader rd = new BufferedReader( new InputStreamReader(response.getEntity().getContent())); StringBuffer result = new StringBuffer(); String line = ""; while ((line = rd.readLine()) != null) { result.append(line); } System.out.println(result.toString()); } // HTTP POST request private void sendPost() throws Exception { String url = "https://selfsolve.apple.com/wcResults.do"; HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost(url); // add header post.setHeader("User-Agent", USER_AGENT); List<NameValuePair> urlParameters = new ArrayList<NameValuePair>(); urlParameters.add(new BasicNameValuePair("sn", "C02G8416DRJM")); urlParameters.add(new BasicNameValuePair("cn", "")); urlParameters.add(new BasicNameValuePair("locale", "")); urlParameters.add(new BasicNameValuePair("caller", "")); urlParameters.add(new BasicNameValuePair("num", "12345")); post.setEntity(new UrlEncodedFormEntity(urlParameters)); HttpResponse response = client.execute(post); System.out.println("\nSending 'POST' request to URL : " + url); System.out.println("Post parameters : " + post.getEntity()); System.out.println("Response Code : " + response.getStatusLine().getStatusCode()); BufferedReader rd = new BufferedReader( new InputStreamReader(response.getEntity().getContent())); StringBuffer result = new StringBuffer(); String line = ""; while ((line = rd.readLine()) != null) { result.append(line); } System.out.println(result.toString()); } }
выходит, что вы также должны позвонить
connection.getOutputStream()
"хотя бы раз" (а такжеsetDoOutput(true)
) для того, чтобы рассматривать его как пост.поэтому минимально необходимый код:
URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //connection.setRequestMethod("POST"); this doesn't seem to do anything at all..so not useful connection.setDoOutput(true); // set it to POST...not enough by itself however, also need the getOutputStream call... connection.connect(); connection.getOutputStream().close();
вы даже можете использовать параметры стиля "GET" в urlString, удивительно. Хотя это может все запутать.
вы также можете использовать NameValuePair видимо.