You are on page 1of 7

Министерство просвещения Республики Молдова

Технический Университет Молдовы


Факультет вычислительной техники информатики и микроэлектроники

Департамент разработки программного обеспечения и Автоматики

Отчёт

PAM

Лабораторная работа №3
Тема: Простой HTTP клиент

Выполнил ст.гр. TI-154: Бежан Николай


Проверил: Русу Кристиан

Кишинёв-2017
Цель работы

Реализация программной эмуляции веб-сервиса бесплатных СМС сообщений Orange

Задание:

- Сервис будет эмулирован, используя методы протокола HTTP (GET, POST);


- Интерфейс приложения должен соответствовать стилю выбранного сервиса;
- Решение минимум трех исключений, определенных выбранным веб сервисом.

Теоретические сведения

HTTP (HyperText Transfer Protocol) — протокол передачи данных в виде документов разметки
в формате «HTML». Основой HTTP является технология «клиент-сервер», то есть
предполагается существование:
- Клиентов, которые инициируют соединение и посылают запрос;
- Серверов, которые ожидают соединения для получения запроса, производят необходимые
действия и возвращают обратно сообщение с результатом.

Клиенты:
Первоначально, протокол HTTP разрабатывался для доступа к гипертекстовым документам
Всемирной паутины. Поэтому основными реализациями клиентов являются браузеры (агенты
пользователя).

Серверы:
Основные реализации: Apache, IIS, Google Web Server.
Структурно, каждое HTTP-сообщение состоит из трёх частей, которые передаются в
указанном порядке:

1. Стартовая строка (Starting line) — определяет тип сообщения;


2. Заголовки (Headers) — характеризуют тело сообщения, параметры передачи и прочие
сведения;
3. Тело сообщения (Message Body) — непосредственно данные сообщения. Обязательно
должно отделяться от заголовков пустой строкой.

Метод HTTP (HTTP Method) — последовательность из любых символов, кроме управляющих


и разделителей, указывающая на основную операцию над ресурсом. Обычно метод
представляет собой короткое английское слово, записанное заглавными буквами.
GET используется для запроса содержимого указанного ресурса. С помощью метода GET
можно также начать какой-либо процесс.
POST применяется для передачи пользовательских данных заданному ресурсу.
Ход работы

Разработка приложения проводилась в среде Android Studio с использованием устройства


Samsung Galaxy S5. Результатом данной лабораторной работы является мобильное
приложение Android эмулирующего работу сервиса по передаче бесплатных сообщений.

class ConnectGetTask extends AsyncTask<Void, Bitmap, Void> {

String urls = "http://www.moldcell.md/";


Bitmap bitmap = null;
String src;

/*
1. onPreExecute(), invoked on the UI thread before the task is executed.
This step is normally used to setup the task, for instance by showing
a progress bar in the user interface.
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
}

/*
2. doInBackground(Params...), invoked on the background thread
immediately after onPreExecute() finishes executing. This step is
used to perform background computation that can take a long time.
The parameters of the asynchronous task are passed to this step.
The result of the computation must be returned by this step and
will be passed back to the last step. This step can also use
publishProgress(Progress...) to publish one or more units of progress.
These values are published on the UI thread, in the
onProgressUpdate(Progress...) step.
*/

@Override
protected Void doInBackground(Void... params) {
String input = "";
try {
//adress of the page with sms
url = new URL(urls + "sendsms");
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = new
BufferedInputStream(urlConnection.getInputStream());
input = readStream(in);
urlConnection.disconnect();
}catch (Exception e){
e.getStackTrace();
}

try {
captcha_sid = input.substring(input.indexOf("input type=\"hidden\"
name=\"captcha_sid\" value=\"")+46,input.indexOf("input type=\"hidden\"
name=\"captcha_sid\" value=\"")+46+8);
captcha_token = input.substring(input.indexOf("input type=\"hidden\"
name=\"captcha_token\" value=\"")+48,input.indexOf("input type=\"hidden\"
name=\"captcha_token\" value=\"")+48+32);
form_build_id = input.substring(input.indexOf("input type=\"hidden\"
name=\"form_build_id\" value=\"")+48,input.indexOf("input type=\"hidden\"
name=\"form_build_id\" value=\"")+48+48);
Log.d("captcha_sid:", captcha_sid);
Log.d("captcha_token:", captcha_token);
Log.d("form_build_id:", form_build_id);

//adress of captcha
int index = input.indexOf("/rom/private/image_captcha?sid");
src = input.substring(index, index + 61);
Log.d("Image", src);
URL urlPic = new URL(urls + src);
URLConnection conn = urlPic.openConnection();
bitmap = BitmapFactory.decodeStream(conn.getInputStream());
} catch (Exception e) {
e.getStackTrace();
}

publishProgress(bitmap);
return null;
}

/*
3. onProgressUpdate(Progress...), invoked on the UI thread after
a call to publishProgress(Progress...). The timing of the execution
is undefined. This method is used to display any form of progress
in the user interface while the background computation is still
executing. For instance, it can be used to animate a progress bar
or show logs in a text field.
*/

@Override
protected void onProgressUpdate(Bitmap... values) {
super.onProgressUpdate(values);
Image.setImageBitmap(values[0]);
}

/*
4. onPostExecute(Result), invoked on the UI thread after the
background computation finishes. The result of the background
computation is passed to this step as a parameter.
*/

@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);

}
}

POST применяется для передачи пользовательских данных заданному ресурсу.

class PostTask extends AsyncTask<String, String, Void>{

protected Void doInBackground(String... params) {


try {
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setReadTimeout(10000);
urlConnection.setConnectTimeout(15000);
urlConnection.setRequestMethod("POST");
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);

Uri.Builder builder = new Uri.Builder()


.appendQueryParameter("phone", params[0])
.appendQueryParameter("name", params[1])
.appendQueryParameter("message", params[2])
.appendQueryParameter("conditions", "on")
.appendQueryParameter("captcha_sid", params[3])
.appendQueryParameter("captcha_token", params[4])
.appendQueryParameter("captcha_response", params[5])
.appendQueryParameter("op", "")
.appendQueryParameter("form_build_id", params[6])
.appendQueryParameter("form_id", "websms_main_form");

String query = builder.build().getEncodedQuery();


OutputStream os = urlConnection.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os,
"UTF-8"));
writer.write(query);
writer.flush();
writer.close();
os.close();
urlConnection.connect();
String url1 = urlConnection.getURL().toString();
int responseCode = urlConnection.getResponseCode();
String url2 = urlConnection.getURL().toString();
String mesg = "";
if (!url1.equals(url2)){
mesg = "Ваше сообщение было успешно отправлено!";
}else{
mesg = "Сообщение не было отправлено, попробуйте позже!!";
}
publishProgress(mesg);
System.out.println("POST Response Code: " + responseCode);
String input = "";
InputStream in = new
BufferedInputStream(urlConnection.getInputStream());
input = readStream(in);
Log.d("Response",input);

}catch (Exception e){


e.getStackTrace();
}
return null;
}

protected void onProgressUpdate(String... values) {


super.onProgressUpdate(values);
Toast.makeText(MainActivity.this, values[0], Toast.LENGTH_LONG).show();
}

protected void onPostExecute(Void result) {


super.onPostExecute(result);
Captcha.setText("");
getTask = new ConnectGetTask();
getTask.execute();
}
}
Вывод
В данной лабораторной работе мы разработали приложение Android. Forms типа органайзер. В
результате выполнения работы, было разработано приложение со следующим функционалом:
- добавление/удаление/изменение записей задач
- уведомление о задаче с использованием службы переднего плана
- просмотр списка для каждого дня и поиск среди записей

Для выполнения работы использовался язык программирования Java в среде разработки


Android Studio.