Ошибка при публикации данных на сервер Rest API с токеном авторизации в Android - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь отправить данные на сервер REST API с помощью дооснащения + RxJava.Когда я пытаюсь отправить данные на сервер, появляется сообщение «Произошла внутренняя ошибка сервера HTTP 500».Но когда данные отправляются с помощью POSTMAN, это удалось.

Это функция для отправки данных в Model.

 // Encountering with 500 server error
fun postSchedule(data : ScheduleResponse , errorLD: MutableLiveData<String>){

    Log.d("POST DATA", "${data.title} ${data.remindMeAt}" )
    userClient.postScheduleItem(data)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .unsubscribeOn(Schedulers.io())
        .subscribe(object  : io.reactivex.Observer<ServerResponse>{
            override fun onComplete() {

            }

            override fun onSubscribe(d: Disposable) {

            }

            override fun onNext(t: ServerResponse) {
                errorLD.value = t.status
            }

            override fun onError(e: Throwable) {
                errorLD.value = e.message
            }
        })
}

Это мой интерфейс API

@Headers("Accept: application/json")
@POST("schedules")
fun postScheduleItem(@Body data: ScheduleResponse): Observable<ServerResponse>

Это клиент для модернизации.val httpLoggingInterceptor = HttpLoggingInterceptor (). setLevel (HttpLoggingInterceptor.Level.BODY) val httpClient = OkHttpClient.Builder ()

var dbInstance: TodoDB = TodoDB.getInstance(context)

var rxJavaAdapter = RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io())
val retrofitBuilder =
    Retrofit.Builder()
        .baseUrl(AppConstants.BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(rxJavaAdapter)

fun <T> createService(serviceClass: Class<T>, authToken: String?): T {

    if (!TextUtils.isEmpty(authToken)) {
        val interceptor = AuthenticationInterceptor(authToken!!)
        if (!httpClient.interceptors().contains(interceptor)) {
            httpClient.addInterceptor(interceptor)
            retrofitBuilder.client(httpClient.build())

        }
    }

    return retrofitBuilder.build().create(serviceClass)
}

Пожалуйста, помогите мне с этим. Спасибо.

1 Ответ

0 голосов
/ 09 декабря 2018

Клиентского кода недостаточно, чтобы определить, что заставляет сервер отвечать 500. Лучшее, что вы можете сделать, - это начать отладку проблемы.

Есть несколько направлений, по которым вы можете пойти:

  1. Если у вас есть доступ к серверу или вы знаете кого-то, кто его имеет, вы можете отладить сервер и определить причину внутренней ошибки сервера.Может быть, журналы сервера также могут помочь, и вам не нужно на самом деле перебирать код сервера.
  2. Если у вас нет доступа к серверу, вы можете посмотреть текст ответа сервера.Может быть, там есть подробное описание ошибки в html, json или другом формате, который поможет вам выяснить причину.
  3. Если описанные выше шаги не помогли, очень полезно знать, чтоЗапрос работает с POSTMAN.Вы можете сравнить точный запрос POSTMAN с точным запросом Retrofit, заголовок за заголовком, строка за строкой.Для этого вы должны сначала добавить ваш httpLoggingInterceptor в ваш клиентский клиент okhttp с помощью

    val httpClient = OkHttpClient.Builder().addNetworkInterceptor(httpLoggingInterceptor)
    

    и найти журнал запросов в logcat.Если вы обнаружите различия между рабочими и неработающими запросами, то вам следует разобраться во всех различиях и скорректировать запрос на модификацию, добавив или изменив заголовки с помощью перехватчиков okhttp, чтобы в конце запрос на модификацию выглядел точнотак же, как запрос POSTMAN.Я предлагаю вам сначала удалить AuthenticationInterceptor и смоделировать его «вручную» с помощью специального перехватчика и жетона аутентификации с жестким кодом.

Повторять запрос каждый раз, когда вы устраняете разницу, чтобы изолировать еепричина внутренней ошибки сервера.

Надеюсь, это поможет!

...