1. Отправка GET запроса на сервер.
Java:
//GetRequest = "http://www.websource.ru/index.php?par1=val1&...&parN=valN"
public static String ReqServerFromClient(String GetRequest) {
String answer = "";
HttpConnection hConnect = null;
InputStream ReadData = null;
try {
hConnect = (HttpConnection) Connector.open(GetRequest, Connector.READ_WRITE, true);
//устанавливаем тип и свойства запроса на сервер
hConnect.setRequestMethod(HttpConnection.GET);
hConnect.setRequestProperty("Connection", "close");
hConnect.setRequestProperty("User-Agent", "Connect (MIDP-2.0: J2ME)");
hConnect.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
hConnect.setRequestProperty("Accept", "text/plain");
//смотрим ответ сервера
if (hConnect.getResponseCode() == HttpConnection.HTTP_OK) {
ReadData = hConnect.openInputStream();
short ch = 4096;
int len = 0;
byte[] buff = new byte[ch];
do {
len = ReadData.read(buff);
if (len > 0) {
answer += new String(buff, 0, len);
}
} while (len > 0);
} else {
answer = //Ответ сервера не 200 //Код ответа здесь - hConnect.getResponseCode();
}
} catch (ConnectionNotFoundException cne) {
answer = //Нет доступа к серверу //Здесь сообщение об ошибке - cne.getMessage();
} catch (ClassCastException e) {
answer = //Не корректный запрос к серверу //Здесь сообщение об ошибке - e.getMessage());
} catch (IOException ioe) {
answer = //Ошибка при соединении с сервером //Здесь сообщение об ошибке - ioe.getMessage());
} catch (SecurityException e) {
answer = //Сетевой запрос отменен пользователем!
} catch (Exception a) {
answer = //Ошибка приложения //Здесь сообщение об ошибке - a.getMessage());
} finally {
try {
ReadData.close();
ReadData = null;
} catch (Exception a) {
}
try {
hConnect.close();
hConnect = null;
} catch (Exception a) {
}
}
return answer;
}
О коде
Сам код достаточно документирован), так что пара моментов тезисно:
- Данная функция желательно должна быть помещена в поток (Runnable) тк понятно, что процесс её выполнения не быстрый)
- hConnect.setRequestProperty можно использовать для установки своих полей в хедере запроса на сервер, к примеру:
hConnect.setRequestProperty("MHEAD", "VALUEHEAD1");
Тогда на стороне сервера если это php, то в массиве $_SERVER по ассоциативному ключу 'HTTP_MHEAD' ($_SERVER['HTTP_MHEAD']) будет находится значение 'VALUEHEAD1'
- С учетом того, что как правило или как закономерность телефоны не достаточно хорошо держат сигнал (опять какая-то низменность или в подьезде или что-то в этом роде), можно добавить запросы-попытки на сервер и после стольки то неудачных попыток - говорить пользователю, что сервер недоступен. Причину скидывания соединения и начала нового (то есть реконнект) придумайте сами - она очевидна судя по комментариям в исходниках GET запроса)
2. Отправка POST запроса на сервер.
//UrlServ = "http://www.websource.ru/index.php"
//PostData = "par1=val1&...&parN=valN"
public static String ReqServerFromClient(String UrlServ, String PostData) {
String answer = "";
HttpConnection hConnect = null;
InputStream ReadData = null;
OutputStream sendData = null;
try {
hConnect = (HttpConnection) Connector.open(UrlServ, Connector.READ_WRITE, true);
//устанавливаем тип и свойства запроса на сервер
hConnect.setRequestMethod(HttpConnection.POST);
hConnect.setRequestProperty("Connection", "close");
hConnect.setRequestProperty("User-Agent", "Connect (MIDP-2.0: J2ME)");
hConnect.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
hConnect.setRequestProperty("Accept", "text/plain");
//отправка POST данных
sendData = hConnect.openOutputStream();
sendData.write(PostData.getBytes());
//смотрим ответ сервера
if (hConnect.getResponseCode() == HttpConnection.HTTP_OK) {
ReadData = hConnect.openInputStream();
short ch = 4096;
int len = 0;
byte[] buff = new byte[ch];
do {
len = ReadData.read(buff);
if (len > 0) {
answer += new String(buff, 0, len);
}
} while (len > 0);
} else {
answer = //Ответ сервера не 200 //Код ответа здесь - hConnect.getResponseCode();
}
} catch (ConnectionNotFoundException cne) {
answer = //Нет доступа к серверу //Здесь сообщение об ошибке - cne.getMessage();
} catch (ClassCastException e) {
answer = //Не корректный запрос к серверу //Здесь сообщение об ошибке - e.getMessage());
} catch (IOException ioe) {
answer = //Ошибка при соединении с сервером //Здесь сообщение об ошибке - ioe.getMessage());
} catch (SecurityException e) {
answer = //Сетевой запрос отменен пользователем!
} catch (Exception a) {
answer = //Ошибка приложения //Здесь сообщение об ошибке - a.getMessage());
} finally {
try {
sendData.close();
sendData = null;
} catch (Exception a) {
}
try {
ReadData.close();
ReadData = null;
} catch (Exception a) {
}
try {
hConnect.close();
hConnect = null;
} catch (Exception a) {
}
}
return answer;
}
Комментарий к коду.
Как видим запрос POST мало чем отличается от GET.
- Указание другого типа запроса:
hConnect.setRequestMethod(HttpConnection.POST);
- Запись POST данных:
sendData = hConnect.openOutputStream();
sendData.write(PostData.getBytes());
Небольшое замечание по показанным примерам отправки данных на сервер.
-
При отправке запросов по правилам нужно указывать еще одно поле в заголовке:
hConnect.setRequestProperty("Content-Length", BodyLen);
Но можете не указывать))
- При создании своих имен в заголовках имейте в виду, что для некоторых моделей телефонов nokia, а следовательно чтобы не гадать сразу делайте так - название своего самопального параметра начинайте с X-.... Все подробности по данной теме смотрите на официальном сайте нокия для разработчиков.