Как сделать POST-запрос с параметром?
Как сделать запрос не пустой, а с POST-параметром запроса (к примеру id)?
ArrayList infoList; private static final String JSON_URL = "http://192.168.0.1/array.php"; loadJSONFromURL(JSON_URL); //------------------------------------------------------------------------------ //начало: private void loadJSONFromURL(String url)< //создание запроса для отправки запроса по URL-адресу: StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener() < @Override public void onResponse(String response) < //получение всего объекта json из ответа: try < JSONObject object = new JSONObject(response); //у нас есть массив с именем users внутри объекта //итак, здесь мы получаем этот массив json: JSONArray jsonArray = object.getJSONArray("users"); ArrayListlistItems = getArrayListFromJSONArray(jsonArray); //создание пользовательского объекта адаптера: infoList = listItems; ListAdapter adapter = new ListViewAdapter(getApplicationContext(),R.layout.row,R.id.textViewName,listItems); //добавление адаптера в listview: listView.setAdapter(adapter); >catch (JSONException e) < e.printStackTrace(); >> >, new Response.ErrorListener() < @Override public void onErrorResponse(VolleyError error) < //отображение ошибки, если происходит: Toast.makeText(getApplicationContext(),error.getMessage(),Toast.LENGTH_SHORT).show(); >>); RequestQueue requestQueue = Volley.newRequestQueue(this); requestQueue.add(stringRequest); > //теперь перебираем все элементы массива json: private ArrayList getArrayListFromJSONArray(JSONArray jsonArray) < ArrayListaList = new ArrayList(); try < if(jsonArray!= null)< for(int i = 0; i> >catch (JSONException js) < js.printStackTrace(); >return aList; >
Отслеживать
8,576 4 4 золотых знака 21 21 серебряный знак 36 36 бронзовых знаков
Как отправить POST запрос с помощью HttpURLConnection?
Добрый вечер. Начал разбираться в программировании под android и нашел много поднобных инструкций по отправке POST запроса на php сервер с помощью HttpClient, но потом выяснил что он устарел и перестал поддерживаться последим SDK который у меня установлен.
После чего узнал что следует пользоваться HttpURLConnection, но информации о том как осуществить с помощью него POST или GET запросы и обработать ответ от сервера не нашел.
Надеюсь на вашу помощь, желательно с подробными примерами. Огромное спасибо.
- Вопрос задан более трёх лет назад
- 38805 просмотров
2 комментария
Оценить 2 комментария
у вас эстафета вот с этим персонажем? Как отправить форму через приложение Android?
ты хот по тостеру поищи, если уж в гугле забанили!
Wolfak @Wolfak Автор вопроса
aol-nnov: к чему этот негатив?! Искал, не нашел! Поэтому и создал вопрос.
Решения вопроса 1
Минимум как-то так. А там сами обработаете что и как требуется и положено.
String myURL = "http://myserver.com"; String params = "param1=1¶m2=XXX"; byte[] data = null; InputStream is = null; try < URL url = new URL(myURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestProperty("Content-Length", "" + Integer.toString(params.getBytes().length)); OutputStream os = conn.getOutputStream(); data = params.getBytes("UTF-8"); os.write(data); data = null; conn.connect(); int responseCode= conn.getResponseCode(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); is = conn.getInputStream(); byte[] buffer = new byte[8192]; // Такого вот размера буфер // Далее, например, вот так читаем ответ int bytesRead; while ((bytesRead = is.read(buffer)) != -1) < baos.write(buffer, 0, bytesRead); >data = baos.toByteArray(); > catch (Exception e) < >finally < try < if (is != null) is.close(); >catch (Exception ex) <> > return data;
Особого отличия от HttpClient нет.
Ответ написан более трёх лет назад
Нравится 3 10 комментариев
Wolfak @Wolfak Автор вопроса
Не могу получить ответ от сервера. Пытаюсь сделать так String ResText = new String(data); чтобы вывести ответ в Toast, но пишет ошибку: Attempt to get length of null array
Wolfak @Wolfak Автор вопроса
В php файле возвращаю ответ через echo.
Wolfak @Wolfak Автор вопроса
Сделал вывод из > catch (Exception e) <, пишет ошибку: Exception: null
Wolfak @Wolfak Автор вопроса
Спасибо, разобрался. Добавил код выше.
Wolfak @Wolfak Автор вопроса
tepexob: а не подскажите, как сделать отправку файла с помощью вашего кода?
Отправка файла - это чуть чуть расширенный POST запрос.
multipart/form-data
По сути нужно заполнить OutputStream дополнительно к текстовым параметрам формы еще и бинарными данными.
Вот какой-то пример есть: Upload a file using HTTPUrlConnection.
Рекомендую сначала настроить свой php и убедиться, что все работает при отправке файла через HTML-форму. Потом уже пробовать свой java-клиент. Для начала пробуйте мелкие бинарники передавать.
Смотрите, чтобы сервер ваш не согласился на прием файла очень большого размера, который ему просто некуда будет сохранить, т.е. нужно ограничение по размеру принимаемого файла. Или прием данных нежелательного содержания, например, какой-либо исполняемый код. Ну, это уже все другие вопросы.
Для отладки выводите лог и обрабатывайте ошибки буквально после каждого действия на клиенте и на сервере.
Wolfak @Wolfak Автор вопроса
tepexob: так и не смог разобраться с отправкой файлов(
Ну, а из простой html формы отправляется файл на сервер? Т.о. нужно быть уверенным, что сервер принимает нормально.
Далее, если вопрос не решится, чтобы понять в чем отличия вашего запроса от запроса из html кода, можно воспользоваться сниффером трафика, например, Wireshark. Хотя это уже не самый простой способ решения задачи — может быть лучше действительно воспользоваться готовыми решениями.
Wolfak @Wolfak Автор вопроса
tepexob: с формы файл отправляется хорошо. Из клиента под Windows Phone тоже. Я не понимаю как в outputstream добавить файл bitmap который перегоняется в byte массив, хотя примеров в интернете много. Не могу подправить свой код (который указал в данном вопросе) чтобы все работало.
Ответы на вопрос 4
Wolfak @Wolfak Автор вопроса
Разобрался, может кому пригодится:
class SendLoginData extends AsyncTask < String resultString = null; @Override protected void onPreExecute() < super.onPreExecute(); >@Override protected Void doInBackground(Void. params) < try < String myURL = "http://site.ru/"; String parammetrs = "param1=1¶m2=XXX"; byte[] data = null; InputStream is = null; try < URL url = new URL(myURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestProperty("Content-Length", "" + Integer.toString(parammetrs.getBytes().length)); OutputStream os = conn.getOutputStream(); data = parammetrs.getBytes("UTF-8"); os.write(data); data = null; conn.connect(); int responseCode= conn.getResponseCode(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); if (responseCode == 200) < is = conn.getInputStream(); byte[] buffer = new byte[8192]; // Такого вот размера буфер // Далее, например, вот так читаем ответ int bytesRead; while ((bytesRead = is.read(buffer)) != -1) < baos.write(buffer, 0, bytesRead); >data = baos.toByteArray(); resultString = new String(data, "UTF-8"); > else < >> catch (MalformedURLException e) < //resultString = "MalformedURLException:" + e.getMessage(); >catch (IOException e) < //resultString = "IOException:" + e.getMessage(); >catch (Exception e) < //resultString = "Exception:" + e.getMessage(); >> catch (Exception e) < e.printStackTrace(); >return null; > @Override protected void onPostExecute(Void result) < super.onPostExecute(result); if(resultString != null) < Toast toast = Toast.makeText(getApplicationContext(), resultString, Toast.LENGTH_SHORT); toast.show(); >> >
Отправка HTTP-запросов GET и POST в Java
С помощью класса HttpURLConnection из пакета java.net можно программным путем отправлять HTTP-запросы в Java. В этом мануале вы узнаете, как с помощью HttpURLConnection в Java-программе отправлять запросы GET и POST, а затем выводить ответ.
Требования
Рассмотрите возможность развертывания localhost Tomcat-сервера.
Краткое описание SpringMVCExample
GET-запрос в Java:
- localhost:8080/SpringMVCExample/

HTTP-запрос GET в Java для страницы входа в систему
- localhost: 8080/SpringMVCExample/login

POST-запрос в Java
- localhost:8080/SpringMVCExample?userName=Pankaj
- localhost:8080/SpringMVCExample/login?userName=Pankaj&pwd=apple123 — для нескольких параметров

Извлечение параметров из формы
HTML страница входа содержит следующую форму:
- method — POST.
- action — home.
- localhost: 8080/SpringMVCExample/home
Мы можем создать POST-запрос для:
localhost:8080/SpringMVCExample/home?userName=PankajЭто будет основой для примера HttpURLConnection.
Пример HttpURLConnection
Ниже описаны шаги по отправке HTTP-запросов с помощью класса HttpURLConnection:
- Создайте URL объект из URL-строки GET или POST.
- Для URL объекта вызовите метод openConnection(), который возвращает экземпляр HttpURLConnection.
- Установите метод запроса в экземпляре HttpURLConnection (значение по умолчанию — GET).
- Вызовите метод setRequestProperty() для экземпляра HttpURLConnection, чтобы установить значения заголовков запроса (например, “User-Agent”, “Accept-Language” и т. д.).
- Для получения HTTP-кода ответа можно вызвать getResponseCode(). Так мы узнаем, был ли запрос успешно обработан или возникла ошибка HTTP.
- Для GET с помощью Reader и InputStream нужно прочитать ответ и обработать его соответствующим образом.
- Запрос POST, прежде чем код обработает ответ, должен получить OutputStream из экземпляра HttpURLConnection и записать в него параметры POST.
Пример программы, которая с помощью HttpURLConnection отправляет запросы GET и POST:
package com.journaldev.utils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class HttpURLConnectionExample private static final String USER_AGENT = "Mozilla/5.0"; private static final String GET_URL = "https://localhost:9090/SpringMVCExample"; private static final String POST_URL = "https://localhost:9090/SpringMVCExample/home"; private static final String POST_PARAMS = "userName=Pankaj"; public static void main(String[] args) throws IOException sendGET(); System.out.println("GET DONE"); sendPOST(); System.out.println("POST DONE"); > private static void sendGET() throws IOException URL obj = new URL(GET_URL); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("GET"); con.setRequestProperty("User-Agent", USER_AGENT); int responseCode = con.getResponseCode(); System.out.println("GET Response Code :: " + responseCode); if (responseCode == HttpURLConnection.HTTP_OK) < // successBufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) response.append(inputLine); > in.close(); // print result System.out.println(response.toString()); > else System.out.println("GET request did not work."); > > private static void sendPOST() throws IOException URL obj = new URL(POST_URL); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("POST"); con.setRequestProperty("User-Agent", USER_AGENT); // For POST only - START con.setDoOutput(true); OutputStream os = con.getOutputStream(); os.write(POST_PARAMS.getBytes()); os.flush(); os.close(); // For POST only - END int responseCode = con.getResponseCode(); System.out.println("POST Response Code :: " + responseCode); if (responseCode == HttpURLConnection.HTTP_OK) < //successBufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) response.append(inputLine); > in.close(); // print result System.out.println(response.toString()); > else System.out.println("POST request did not work."); > > >
Скомпилируйте и запустите код. Он выдаст такой результат:
GET Response Code :: 200
Home Hello world!The time on the server is March 6, 2015 9:31:04 PM IST.