Android / Java: проблема с отправкой параметра и получением ответа JSON с RetroFit в POST - PullRequest
1 голос
/ 11 февраля 2020

Я хотел бы отправить параметр в POST с помощью RetroFit , но невозможно найти решение.

Я просто хочу передать URL, с params с ключом и значением, и получите JSON ответ типа

{"result":[{"id":196,"CREATION_DATE":"2020-01-22T14:33:49.000Z"}]}  

Вот мой код Модификация:

public interface RetrofitInterface {

    @Headers({"Content-type: application/json" , "Accept : application/json"})
    @Streaming
    @POST("https://xxx.newtotelapps.fr:5000/device/listEvent")
    Call<JSONObject> getListEvent(@Body JSONObject jsonObject);
}

Мой основной код:

                JSONObject params2 = new JSONObject();
                try {
                    params2.put("CODE_USER", UserCode);
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                CookieJar cookieJar2 = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(getApplicationContext()));

                OkHttpClient client2 = new OkHttpClient.Builder()
                        .cookieJar(cookieJar2)
                        .build();

                Retrofit retrofit3 = new Retrofit.Builder()
                        .baseUrl("https://xxx.newtotelapps.fr:5000/device/listEvent/")
                        .addConverterFactory(ScalarsConverterFactory.create())
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

                RetrofitInterface downloadService2 = retrofit3.create(RetrofitInterface.class);

                Call<JSONObject> call2 = downloadService2.getListEvent(params2);

                call2.enqueue(new Callback<JSONObject>() {
                        @Override
                        public void onResponse(Call<JSONObject> call, Response<JSONObject> response) {
                            //displaying the message from the response as toast


                            System.out.println("test ");

                        }

                    @Override
                    public void onFailure(Call<JSONObject> call, Throwable t){
                    System.out.println(t.toString());
                }
                });

У меня есть это сообщение об ошибке: java.lang.IllegalArgumentException: Unexpected char 0x20 at 6 in header name: Accept

РЕДАКТИРОВАТЬ: Я подавляю пробел между «Принять» и «:», и у меня сейчас это сообщение об ошибке: java.io.IOException: unexpected end of stream on https://xxx.newtotelapps.fr:5000/...

1 Ответ

0 голосов
/ 11 февраля 2020

РЕДАКТИРОВАТЬ:

0x20 символов

Символ пробела, который обозначает пробел между словами, созданный пробелом клавиатура, представленная кодом 0x20 (шестнадцатеричный), считается непечатным графическим элементом c (или невидимым графическим элементом c), а не управляющим символом.

Скопируйте следующий код:

public interface RetrofitInterface {

@Headers({"Content-type: application/json" , "Accept: application/json"})
@Streaming
@POST("https://xxx.newtotelapps.fr:5000/device/listEvent")
Call<JSONObject> getListEvent(@Body JSONObject jsonObject);

}

вы ошибочно оставляете пробел после " Accept: ". Сделайте это " Примите: "

Решение для ошибки: java.io.IOException: unexpected end of stream on https://xxx.newtotelapps.fr:5000/...

Используйте Google Gson Библиотека, добавьте ее в build.gradle:

dependencies {
    implementation 'com.google.code.gson:gson:2.8.6'
}

Использование: import com.google.gson.JsonObject;

Вместо: import org.json.JSONObject;

Надеюсь, вы получите его .

В другом случае может возникнуть ошибка:

Вам необходимо установить Connection:close в заголовке.

@Headers({"Content-type: application/json" , "Accept: application/json", "Connection: close"})

Также ошибка может возникнуть в 3-м случае:

с проблемой на стороне сервера ... вам нужно установить header('Content-Length: '.$length); в сценарии на стороне сервера

...