Как сделать запрос POST с помощью retrofit 2?

я смог запустить только пример hello world (GithubService) из документов.

проблема в том, когда я запускаю свой код, я получаю следующую ошибку, внутри onFailure()

Использовать JsonReader.setLenient (true) для принятия искаженного JSON в строке 1 столбец 1 путь $

мой API принимает значение POST params, поэтому нет необходимости кодировать их как JSON, но он возвращает ответ в JSON.

для ответа я получил класс ApiResponse что я создал с помощью инструментов.

интерфейс:

public interface ApiService {
    @POST("/")
    Call<ApiResponse> request(@Body HashMap<String, String> parameters);
}

вот как я использую сервис:

HashMap<String, String> parameters = new HashMap<>();
parameters.put("api_key", "xxxxxxxxx");
parameters.put("app_id", "xxxxxxxxxxx");

Call<ApiResponse> call = client.request(parameters);
call.enqueue(new Callback<ApiResponse>() {
    @Override
    public void onResponse(Response<ApiResponse> response) {
        Log.d(LOG_TAG, "message = " + response.message());
        if(response.isSuccess()){
            Log.d(LOG_TAG, "-----isSuccess----");
        }else{
            Log.d(LOG_TAG, "-----isFalse-----");
        }

    }
    @Override
    public void onFailure(Throwable t) {
        Log.d(LOG_TAG, "----onFailure------");
        Log.e(LOG_TAG, t.getMessage());
        Log.d(LOG_TAG, "----onFailure------");
    }
});

2 ответов


Если вы не хотите, чтобы JSON-кодированные параметры использовали это:

@FormUrlEncoded
@POST("/")
Call<ApiResponse> request(@Field("api_key") String apiKey, @Field("app_id") String appId);

вы должны знать, как вы хотите кодировать post params. Важно также @Header аннотация в следующем. Он используется для определения используемого типа контента в заголовке HTTP.

@Headers("Content-type: application/json")
@POST("user/savetext")
    public Call<Id> changeShortText(@Body MyObjectToSend text);

вы должны каким-то образом кодировать свои почтовые параметры. Чтобы использовать JSON для передачи, вы должны добавить .addConverterFactory(GsonConverterFactory.create(gson)) в вашей декларации модернизации.

Retrofit restAdapter = new Retrofit.Builder()
                .baseUrl(RestConstants.BASE_URL)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(httpClient)
                .build();

другим источником вашей проблемы может быть то, что JSON, который исходит от остальной части бэкэнда, кажется неправильным. Вы должны проверить синтаксис JSON с валидатором, например http://jsonlint.com/.