如何使用改造2提出POST请求?

2022-09-04 08:45:03

我只能从文档中运行hello world示例(GithubService)。

问题是当我运行我的代码时,我得到以下错误,里面onFailure()

使用 JsonReader.setLenient(true) 在第 1 行第 1 列路径处接受格式错误的 JSON $

我的API采用POST参数值,因此无需将它们编码为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------");
    }
});

答案 1

如果您不想要 JSON 编码的参数,请使用以下命令:

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

答案 2

您应该知道您希望如何对后期参数进行编码。同样重要的是下面的注释。它用于在 HTTP 标头中定义使用的内容类型。@Header

@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/