Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 26.05.2019
Сообщений: 26

Отправка post запроса на сервер (okhttp)

25.06.2019, 11:41. Показов 5585. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Столкнулся с проблемой отправки post запроса на сервер. Рекомендуют использовать okhttp или retrofit. Retrofit показался мне сложнее, поэтому решил использовать okhttp. Посмотрев документацию нашел код отправки запроса:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class RequestSenderClass {
 
    final MediaType JSON = MediaType.get("application/json; charset=utf-8");
 
    OkHttpClient client = new OkHttpClient();
 
    String post (String url, String json) throws IOException {
        RequestBody body = RequestBody.create(JSON, json);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        try (Response response = client.newCall(request).execute()) {
            return response.body().string();
        }
    }
}
Прописав все import'ы и dependencies, выделяет get красным.
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
Для решения ошибки предлагается переделать get в parse. Но не уверен, на сколько это будет правильно.

Пытался закинуть весь код в метод, чтобы потом вызвать его в обработчике нажатия кнопки, но тогда показывает ошибки в url, json, post и т.д.
По нажатию кнопки должно браться значение из EditText и передаваться в отправщик запроса, и потом возвращаться ответное значение от сервера, с которым дальше необходимо проводить операции. Подскажите, как решить данную проблему ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.06.2019, 11:41
Ответы с готовыми решениями:

Выполнение POST запроса с использованием okhttp
Добрый день! Пытаюсь Вытащить данные из базы mysql при помощи okhttp Но запрос на сервер остуществляется после выполнения основной...

Отправка POST-запроса на сервер
Задача - отправить на сервер запрос (либо параметры для запроса на сервере) и получить выборку. Однако с отправкой возникли проблемы. ...

Отправка POST запроса
Добрый день! столкнулся с проблемой, не могу отправить пост запрос, сваливаюсь на OutputStream os = con.getOutputStream(); в query...

16
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
25.06.2019, 11:50
Так норм:
Java
1
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
0
0 / 0 / 0
Регистрация: 26.05.2019
Сообщений: 26
26.06.2019, 10:10  [ТС]
Цитата Сообщение от ExFau$t Посмотреть сообщение
Так норм:
Попытался так сделать, но что то все равно не работает. Скорей всего, я как-то не так обрабатываю или передаю данные.
Вот код обработки нажатия на кнопку в activity:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void BtnClick(View view) throws Exception {
        
        String url = "http://example.ru";
        String json = "{cardnumber: 1}";
 
        RequestSenderClass.post(url, json);
 
        AlertDialog.Builder builder = new AlertDialog.Builder(IntegrashionLib.this);
        builder.setTitle("Важное сообщение!")
                .setMessage(url+json)
                .setCancelable(false)
                .setNegativeButton("Закрыть алерт",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });
        AlertDialog alert = builder.create();
        alert.show();
}
При нажатии на кнопку, сразу выдается, что в приложении произошла ошибка. Подскажите, в чем может быть дело ?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
26.06.2019, 10:59
А что здесь должно работать? Запросы идут всегда в другом потоке и, как правило, выполняются дольше других операций с view.
А ошибку надо смотреть во вкладке logcat.
0
0 / 0 / 0
Регистрация: 26.05.2019
Сообщений: 26
26.06.2019, 11:32  [ТС]
Цитата Сообщение от ExFau$t Посмотреть сообщение
А что здесь должно работать? Запросы идут всегда в другом потоке и, как правило, выполняются дольше других операций с view.
А ошибку надо смотреть во вкладке logcat.
Вот что выводится в logcat:

Кликните здесь для просмотра всего текста
06-26 13:17:47.132 17784-17784/com.example.evotorproject E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.evotorproject, PID: 17784
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app.AppCompatViewInfl ater$DeclaredOnClickListener.onClick(App CompatViewInflater.java:390)
at android.view.View.performClick(View.java :4782)
at android.view.View$PerformClick.run(View. java:19879)
at android.os.Handler.handleCallback(Handle r.java:739)
at android.os.Handler.dispatchMessage(Handl er.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(Activity Thread.java:5281)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.j ava:372)
at com.android.internal.os.ZygoteInit$Metho dAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main( ZygoteInit.java:707)
Caused by: java.lang.reflect.InvocationTargetExcept ion
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.j ava:372)
at androidx.appcompat.app.AppCompatViewInfl ater$DeclaredOnClickListener.onClick(App CompatViewInflater.java:385)
at android.view.View.performClick(View.java :4782)*
at android.view.View$PerformClick.run(View. java:19879)*
at android.os.Handler.handleCallback(Handle r.java:739)*
at android.os.Handler.dispatchMessage(Handl er.java:95)*
at android.os.Looper.loop(Looper.java:135)*
at android.app.ActivityThread.main(Activity Thread.java:5281)*
at java.lang.reflect.Method.invoke(Native Method)*
at java.lang.reflect.Method.invoke(Method.j ava:372)*
at com.android.internal.os.ZygoteInit$Metho dAndArgsCaller.run(ZygoteInit.java:912)*
at com.android.internal.os.ZygoteInit.main( ZygoteInit.java:707)*
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardP olicy.onNetwork(StrictMode.java:1147)
at java.net.InetAddress.lookupHostByName(In etAddress.java:418)
at java.net.InetAddress.getAllByNameImpl(In etAddress.java:252)
at java.net.InetAddress.getAllByName(InetAd dress.java:215)
at okhttp3.Dns$1.lookup(Dns.java:40)
at okhttp3.internal.connection.RouteSelecto r.resetNextInetSocketAddress(RouteSelect or.java:185)
at okhttp3.internal.connection.RouteSelecto r.nextProxy(RouteSelector.java:149)
at okhttp3.internal.connection.RouteSelecto r.next(RouteSelector.java:84)
at okhttp3.internal.connection.StreamAlloca tion.findConnection(StreamAllocation.jav a:214)
at okhttp3.internal.connection.StreamAlloca tion.findHealthyConnection(StreamAllocat ion.java:135)
at okhttp3.internal.connection.StreamAlloca tion.newStream(StreamAllocation.java:114 )
at okhttp3.internal.connection.ConnectInter ceptor.intercept(ConnectInterceptor.java :42)
at okhttp3.internal.http.RealInterceptorCha in.proceed(RealInterceptorChain.java:147 )
at okhttp3.internal.http.RealInterceptorCha in.proceed(RealInterceptorChain.java:121 )
at okhttp3.internal.cache.CacheInterceptor. intercept(CacheInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorCha in.proceed(RealInterceptorChain.java:147 )
at okhttp3.internal.http.RealInterceptorCha in.proceed(RealInterceptorChain.java:121 )
at okhttp3.internal.http.BridgeInterceptor. intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorCha in.proceed(RealInterceptorChain.java:147 )
at okhttp3.internal.http.RetryAndFollowUpIn terceptor.intercept(RetryAndFollowUpInte rceptor.java:126)
at okhttp3.internal.http.RealInterceptorCha in.proceed(RealInterceptorChain.java:147 )
at okhttp3.internal.http.RealInterceptorCha in.proceed(RealInterceptorChain.java:121 )
at okhttp3.RealCall.getResponseWithIntercep torChain(RealCall.java:200)
at okhttp3.RealCall.execute(RealCall.java:7 7)
at com.example.evotorproject.RequestSenderC lass.post(RequestSenderClass.java:23)
at com.example.evotorproject.IntegrashionLi b.BtnClick(IntegrashionLib.java:41)
at java.lang.reflect.Method.invoke(Native Method)*
at java.lang.reflect.Method.invoke(Method.j ava:372)*
at androidx.appcompat.app.AppCompatViewInfl ater$DeclaredOnClickListener.onClick(App CompatViewInflater.java:385)*
at android.view.View.performClick(View.java :4782)*
at android.view.View$PerformClick.run(View. java:19879)*
at android.os.Handler.handleCallback(Handle r.java:739)*
at android.os.Handler.dispatchMessage(Handl er.java:95)*
at android.os.Looper.loop(Looper.java:135)*
at android.app.ActivityThread.main(Activity Thread.java:5281)*
at java.lang.reflect.Method.invoke(Native Method)*
at java.lang.reflect.Method.invoke(Method.j ava:372)*
at com.android.internal.os.ZygoteInit$Metho dAndArgsCaller.run(ZygoteInit.java:912)*
at com.android.internal.os.ZygoteInit.main( ZygoteInit.java:707)


Если честно, не особо понимаю какие тут ошибки, тк опыта разработки у меня мало.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
26.06.2019, 11:43
Вот:
Цитата Сообщение от Santa866 Посмотреть сообщение
NetworkOnMainThreadException
Цитата Сообщение от ExFau$t Посмотреть сообщение
Запросы идут всегда в другом потоке
0
0 / 0 / 0
Регистрация: 26.05.2019
Сообщений: 26
26.06.2019, 13:08  [ТС]
Цитата Сообщение от ExFau$t Посмотреть сообщение
Вот:
Получается, мне сейчас необходимо сделать asynctask, и потом в doinbackground засунуть код отправки запроса ?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
26.06.2019, 13:09
Просто возьми retrofit, там всё идёт из коробки.
1
0 / 0 / 0
Регистрация: 26.05.2019
Сообщений: 26
26.06.2019, 13:13  [ТС]
Цитата Сообщение от ExFau$t Посмотреть сообщение
Просто возьми retrofit, там всё идёт и коробки.
Посмотрев retrofit, он показался мне намного сложнее чем okhttp, поэтому и выбрал okhttp. Сейчас тогда еще почитаю по retrofit
0
0 / 0 / 0
Регистрация: 26.05.2019
Сообщений: 26
27.06.2019, 10:16  [ТС]
Цитата Сообщение от ExFau$t Посмотреть сообщение
Просто возьми retrofit, там всё идёт из коробки.
Почитал документацию по retrofit и посмотрел примеры. Создал 3 класса. Правильно ли я их понял и создал ?
1) Класс-модель, который обрабатывает ответ от сервера. После запроса возвращаются данные name, last_name, bonus.
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
 
public class RequestSenderClass {
 
 
    @SerializedName("bonus")
    @Expose
    private String bonus;
 
 
    @SerializedName("name")
    @Expose
    private String name;
 
 
    @SerializedName("last_name")
    @Expose
    private String last_name;
 
 
    public String getbonus() {return bonus;}
    public void setbonus(String bonus) {this.bonus = bonus;}
 
 
    public String getname() {return name;}
    public void setname(String name) {this.name = name;}
 
 
    public String getlast_name() {return last_name;}
    public void setlast_name(String last_name) {this.last_name = last_name;}
}


2) Класс, используя метод которого мы отправляем запрос
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import com.example.evotorproject.RequestInt;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
 
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
 
public class RequestSender {
    static final String BASE_URL = "http://example.ru";
 
    public static RequestInt getApi() {
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();
 
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
 
        RequestInt requestResult = retrofit.create(RequestInt.class);
        return requestResult;
 
    }
}


3) Интерфейс с методом обработки 1 класса
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
import java.util.List;
 
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
 
public interface RequestInt {
 
    @GET("/client")
    Call<List<RequestSenderClass>> getData(@Query("cardnumber") String resourceName);
 
}


По нажатию кнопки я беру введенное значение (cardnumber) и отправляю запрос. И какой все-таки метод нужно будет вызывать из обработчика нажатия кнопки ? GetApi из requestSender (2 класс) ?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
27.06.2019, 10:39
Было бы лучше, если бы во "втором классе" было только создание билдера retrofit и клиента okhttp (если надо). Метод getData это уже и есть твой запрос, нужно лишь где-то его вызвать и обработать ответ.
0
0 / 0 / 0
Регистрация: 26.05.2019
Сообщений: 26
27.06.2019, 11:05  [ТС]
Цитата Сообщение от ExFau$t Посмотреть сообщение
Было бы лучше, если бы во "втором классе" было только создание билдера retrofit и клиента okhttp (если надо). Метод getData это уже и есть твой запрос, нужно лишь где-то его вызвать и обработать ответ.
Получается RequestSender - это и есть билдер retrofit, а обработчик ответа RequestSenderClass ?
Вы имеете ввиду, что надо в классе RequestSender убрать GsonBuilder и оставить только Retrofit.Builder ?
И получается мне нужно будет вызвать getData, который отправит такой запрос: http://example.ru/client?cardnumber="мое значение edittext", из обработчика кнопки и обработать результат ?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
27.06.2019, 11:39
Я хотел сказать, что по структуре второй класс отвечает за инициализацию ретрофита, 3й - интерфейс запроса, а 1й - тупо модель, в которую запихаются данные. Соответственно, где-то, предположим в обработчике нажатия, надо взять инициализированный ретрофит и вызвать метод с колбеками. Здесь подробно всё описано:
http://developer.alexanderklim... trofit.php
0
0 / 0 / 0
Регистрация: 26.05.2019
Сообщений: 26
27.06.2019, 14:03  [ТС]
Цитата Сообщение от ExFau$t Посмотреть сообщение
Я хотел сказать, что по структуре второй класс отвечает за инициализацию ретрофита, 3й - интерфейс запроса, а 1й - тупо модель, в которую запихаются данные. Соответственно, где-то, предположим в обработчике нажатия, надо взять инициализированный ретрофит и вызвать метод с колбеками. Здесь подробно всё описано:
http://developer.alexanderklim... trofit.php
Как я понял из доков, мне нужно получается выполнить следующее:
Далее в его методе create() указываем наш класс интерфейса с запросами к сайту.

UserService userService = retrofit.create(UserService.class);
После этого мы получаем объект Call и вызываем метод enqueue() (для асинхронного вызова) и создаём для него Callback. Запрос будет выполнен в отдельном потоке, а результат придет в Callback в main-потоке.

В результате библиотека Retrofit сделает запрос, получит ответ и производёт разбор ответа, раскладывая по полочкам данные. Вам остаётся только вызывать нужные методы класса-модели для извлечения данных.
Раз в create все уже записано, то остается только получить Call. Правильно ли я это делаю так (находится в обработчике кнопки):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Call call = new Call() {
            @Override
            public Request request() {return null;}
 
            @Override
            public Response execute() throws IOException {return null;}
 
            @Override
            public void enqueue(Callback responseCallback) { }
 
            @Override
            public void cancel() { }
 
            @Override
            public boolean isExecuted() {return false;}
 
            @Override
            public boolean isCanceled() {return false;}
 
            @Override
            public Call clone() {return null;}
        };
И получается уже тут в enqueue пишу return ?

Добавлено через 1 час 38 минут
Цитата Сообщение от ExFau$t Посмотреть сообщение
Я хотел сказать, что по структуре второй класс отвечает за инициализацию ретрофита, 3й - интерфейс запроса, а 1й - тупо модель, в которую запихаются данные. Соответственно, где-то, предположим в обработчике нажатия, надо взять инициализированный ретрофит и вызвать метод с колбеками. Здесь подробно всё описано:
http://developer.alexanderklim... trofit.php
В общем не пойму как все это реализовать. Можете помочь с этим ?
0
0 / 0 / 0
Регистрация: 26.05.2019
Сообщений: 26
29.06.2019, 18:54  [ТС]
ExFau$t
Подскажите пожалуйста. Я остановился на том, что создал (как мне кажется) все необходимые методы и вызываю их. Но ответ от сервера не приходит, постоянно попадает в catch. В чем может быть проблема ? Постоянно возвращается "не прошел". В манифесте добавлено <uses-permission android:name="android.permission.INTERNE T" />.

Код asynctaks, который выведет значение answer в алерт
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class SendData extends AsyncTask<Void, String, String> {
 
        //String answer = "asyncTask";
 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
 
        @Override
        protected String doInBackground(Void... params) {
            String answer = "начало";
            try {
                String url = "https://example.ru";
                PostExample example = new PostExample();
                answer = example.run(url);
            } catch (Exception e) {
                answer = "не прошел";
            }
            return answer;
        }
 
        protected void onPostExecute(String answer) {
            super.onPostExecute(answer);
            AlertDialog.Builder builder = new AlertDialog.Builder(IntegrashionLib.this);
            builder.setTitle("Важное сообщение!")
                    .setMessage(answer)
                    .setCancelable(false)
                    .setNegativeButton("Закрыть алерт",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    dialog.cancel();
                                }
                            });
            AlertDialog alert = builder.create();
            alert.show();
        }
    }


Сам код отправки запроса:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class PostExample {
 
    String run(String url) throws IOException {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .build();
 
        try (Response response = client.newCall(request).execute()) {
            return response.body().string();
        }
    }
}


Обработчик нажатия кнопки:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
public void BtnClick(View view) throws Exception {
        // Обработчик нажатия кнопки продолжить
 
        final EditText cardnum = findViewById(R.id.InputNumber);
        String card = cardnum.getText().toString();
 
        try{
            new SendData().execute();
        } 
        catch (Exception e){
        }
}
0
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 477
29.06.2019, 23:14
Можно не делать AsyncTask.
Вместо client.newCall(request).execute();
выполнить
client.newCall(request).enqueue(new Callback() {...

Главное не забыть, что обращение из колбэков к UI надо делать через Handler.
0
0 / 0 / 0
Регистрация: 26.05.2019
Сообщений: 26
30.06.2019, 15:40  [ТС]
Цитата Сообщение от vs2019 Посмотреть сообщение
Можно не делать AsyncTask.
Вместо client.newCall(request).execute();
выполнить
client.newCall(request).enqueue(new Callback() {...
Главное не забыть, что обращение из колбэков к UI надо делать через Handler.
Вот такую ошибку выдает, когда происходит запрос на сервер:
java.security.cert.certpathvalidatorexce ption: trust anchor for certification path not found
Как я понимаю, это из-за того, что проблемы с безопасным соединением к сайту. Как можно это решить ? Т.к. к гугл транслейт подлючается нормально и выдает код ответа 200.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.06.2019, 15:40
Помогаю со студенческими работами здесь

Отправка POST запроса
Здравствуйте! Решил попробовать написать приложение на Android. Задачу поставил такую, что надо отправить с android-а на сервер post...

Отправка POST запроса
Здраствуйте, нужно на сайт отправить пост запрос з логином і паролем, потом сайт оддаст строку, ее нужно вивсти в текствів, у меня есть код...

Отправка POST запроса серверу
Здравствуйте. Пишу приложение для Android, которое получает данные о местонахождении и отправляет их на Web-сервер. Данные о...

Не работает отправка POST запроса
try{ HttpClient httpclient = new DefaultHttpClient(); //YOUR PHP SCRIPT ADDRESS HttpPost httppost...

Отправка Post запроса в Android предложении
Есть определенная php страница надо отправить на нее Post запрос из Android приложения Например на такую страниц...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru