Реклама

 
1 голос
 
153 просмотра
4.01.2019 / 18:16  wRadchuk

Помогите с запросом через Retrofit2

Пытаюсь получить ответ с сайта, но кидает в метод onFailure(), вот код:

  1. package wradchuk.pointapprf2.net;
  2.  
  3. public class ServerResponce
  4. {
  5.  
  6.     private String responce;
  7.  
  8.     public void setResponse(String _responce)
  9.     {
  10.         this.responce = _responce;
  11.     }
  12.  
  13.     public String getResponse()
  14.     {
  15.         return responce;
  16.     }
  17. }


  1. package wradchuk.pointapprf2.net;
  2.  
  3. import java.util.List;
  4.  
  5. import retrofit2.Call;
  6. import retrofit2.http.GET;
  7. import retrofit2.http.Path;
  8.  
  9. public interface MyApi
  10. {
  11.     @GET("reg/getUserReg/{login}/{password}")
  12.     Call<List<ServerResponce>> getUserReg(@Path("login") String login, @Path("password") String password);
  13. }

  1. package wradchuk.pointapprf2;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.widget.TextView;
  6. import android.widget.Toast;
  7.  
  8. import com.google.gson.Gson;
  9. import com.google.gson.GsonBuilder;
  10.  
  11. import java.util.List;
  12.  
  13. import okhttp3.OkHttpClient;
  14. import okhttp3.logging.HttpLoggingInterceptor;
  15. import retrofit2.Call;
  16. import retrofit2.Callback;
  17. import retrofit2.Response;
  18. import retrofit2.Retrofit;
  19. import retrofit2.converter.gson.GsonConverterFactory;
  20. import wradchuk.pointapprf2.net.MyApi;
  21. import wradchuk.pointapprf2.net.ServerResponce;
  22.  
  23. public class MainActivity extends Activity
  24. {
  25.  
  26.     public TextView textView;
  27.     static final String BASE_URL = "https://pointsales.buisness-app.ru/";
  28.  
  29.  
  30.     @Override
  31.     protected void onCreate(Bundle savedInstanceState)
  32.     {
  33.         super.onCreate(savedInstanceState);
  34.         setContentView(R.layout.activity_main);
  35.  
  36.         textView = findViewById(R.id.textView);
  37.  
  38.         Gson gson = new GsonBuilder()
  39.                 .setLenient()
  40.                .create();
  41.  
  42.         HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
  43.         interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
  44.         OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
  45.  
  46.  
  47.         Retrofit retrofit = new Retrofit.Builder()
  48.                 .baseUrl(BASE_URL)
  49.                 .addConverterFactory(GsonConverterFactory.create(gson))
  50.                 .client(client)
  51.                 .build();
  52.  
  53.         MyApi api = retrofit.create(MyApi.class);
  54.         textView.setText(api.getUserReg("wRadchuk", "wradchuk").request().url().toString());
  55.  
  56.         api.getUserReg("wRadchuk", "wradchuk").enqueue(new Callback<List<ServerResponce>>() {
  57.             @Override
  58.             public void onResponse(Call<List<ServerResponce>> call, Response<List<ServerResponce>> response) {
  59.                 textView.setText(response.body().toString());
  60.  
  61.             }
  62.  
  63.             @Override
  64.             public void onFailure(Call<List<ServerResponce>> call, Throwable t) {
  65.                 Toast.makeText(MainActivity.this, "An error occurred during networking", Toast.LENGTH_SHORT).show();
  66.             }
  67.         });
  68.  
  69.     }
  70.  
  71. }


Я хочу получить ответ формате JSON. На странице такой текст ответа: ["0",6]
И okhttp3 его видит, то есть сайт открывает и читает, но что тогда не так?

З.Ы. До этого не работал с Retrofit2 и не работал с сетью, помогите плиз!))
4.01.2019 / 20:53  wRadchuk
  1. api.getUserReg("wRadchuk", "wradchuk").enqueue(new Callback<MyServerResponce>()
  2. {
  3.  @Override
  4. public void onResponse(Call<MyServerResponce> call, Response<MyServerResponce> response)
  5. {
  6. textView.setText("response:" + response.body().toString());
  7. }

и теперь строка
  1. textView.setText("response:" + response.body().toString());
выводит это
  1. wradchuk.pointapprf2.net.MyServerResponce@2d383d6
Как вывести текст со страницы? Вот Logcat
4.01.2019 / 20:54  wRadchuk
Вот Logcat:
  1. 01-04 18:32:56.098 9354-9371/wradchuk.pointapprf2 D/OkHttp: <-- 200 [url]https://pointsales.buisness-app.ru/reg/getUserReg/wRadchuk/wradchuk[/url] (239ms)
  2.     server: nginx-reuseport/1.13.4
  3.     date: Fri, 04 Jan 2019 18:32:56 GMT
  4.     content-type: application/json
  5.     content-length: 29
  6.     x-powered-by: PHP/5.6.30
  7. 01-04 18:32:56.099 9354-9371/wradchuk.pointapprf2 D/OkHttp: {"id": 0, "name": "wRadchuk"}
  8.     <-- END HTTP (29-byte body)

Как получить эти дан
4.01.2019 / 20:55  wRadchuk
из строки D/OkHttp: {"id": 0, "name": "wRadchuk"}
тут данные что отображает странница {"id": 0, "name": "wRadchuk"}, статичный JSON для теста.
4.01.2019 / 23:44  aNNiMON
toString переопредели у своего класса MyServerResponce
Ответы
 
1 голос
 
# 4.01.2019 / 18:35  aNNiMON
Метод ждёт List<ServerResponce>, то есть в json это будет массив из объектов. Но сервер возвращает массив из разнородных значений (строка, число).

Проблема скорее на стороне сервера. Во-первых, ответ должен быть более осмысленным, например:
[{"id": 0, "name": "wRadchuk"}]
Во-вторых, заголовок Content-Type правильный нужно указать.
  1. header('Content-Type: application/json');
  2. echo json_encode(...);
Изм. aNNiMON от 4.01.2019 / 19:04
4.01.2019 / 18:39  wRadchuk
Так я вывожу на станицу JSON:
  1. $result =  json_encode(array("0", RESPONSE_KEY));
4.01.2019 / 18:42  wRadchuk
А вот код страницы:
[img]https://yadi.sk/i/Ez89LfiCiaW46A[/img]
4.01.2019 / 18:45  wRadchuk
А вот и ошибка:
  1. 01-04 16:44:48.250 7371-7371/wradchuk.pointapprf2 D/PARF2: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3 path $[0]
4.01.2019 / 19:03  aNNiMON
Обновил ответ
 
0 голосов
 
# 4.01.2019 / 19:18  Naik
Еще я бы посоветовал использовать Java 8, тогда не было бы кучи кода в листенерах. Ну и потом можно подключить RxJava2, с ней работать с Retrofit намного приятнее, особенно когда нужно скомпоновать результат нескольких запросов или преобразовать данные.
4.01.2019 / 21:01  wRadchuk
А есть пример реализующий то что ты описал? Я ноль в самом ретрофит и не работал с сетью.
Всего: 2

Мы в соцсетях

vk tw tg yt

Пожертвования

Аноним2850 р.
Freddy1700 р.
riseremi1611 р.
NaruTrey800 р.
vlavolk637 р.