相关疑难解决方法(0)

使用Retrofit从RetrofitError对象获取JSON

我正在使用Retrofit库对我正在使用的服务进行REST调用.

如果我对我的服务进行API调用并出现故障,该服务会返回一些JSON以及标准的HTTP错误内容.使用RetrofitError故障回调中包含的对象,我能够找到HTTP状态代码和其他几个东西,但是我无法检索服务发回的JSON.

例如,假设我调用了我尝试创建用户的API.如果用户名已经存在,该服务将返回400错误代码以及一些JSON,如下所示:

{"error":"Username already in use"}
Run Code Online (Sandbox Code Playgroud)

因为一个简单的400错误代码不够具体,我真的需要访问返回的JSON.

有谁知道我如何获得这个JSON数据?我试着查看RetrofitError对象中的每个字段,但无法在任何地方找到它.我还需要做些什么吗?

android retrofit

39
推荐指数
4
解决办法
3万
查看次数

Retrofit 2:responseBodyConverter转换为null对象

我正在使用Retrofit的最新版本(截至2.0.0-beta4版本).当从服务器接收200 OK代码时,一切正常.但我也想处理不好的响应,例如代码401.所以,我必须得到错误响应代码,以确切地确定要执行的操作并显示适当的数据:

@Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
    if (response != null && !response.isSuccess() && response.errorBody() != null) {
        Converter<ResponseBody, APIError> errorConverter = retrofit.responseBodyConverter(APIError.class, new Annotation[0]);
        try {
            APIError error = errorConverter.convert(response.errorBody());
            Toast.makeText(getContext(), "code = " + error.getCode() + ", status = " + error.getStatus(), Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else if (null != response) {
        if (response.isSuccess()) {
            LoginResponse loginResponse = response.body();
            Toast.makeText(getContext(), "Successful login: " + loginResponse.getId(), Toast.LENGTH_SHORT).show();
        }
    } …
Run Code Online (Sandbox Code Playgroud)

error-handling android http retrofit retrofit2

9
推荐指数
1
解决办法
3558
查看次数

如何使用 Retrofit 2 获取错误正文响应

我正在使用 Retrofit 2,我需要处理 JSON 格式的响应错误。以下是响应正文的示例。

{
    "success": false,
    "error": {
        "message": {
            "name": [
                "This input is required."
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

message包含有错误的字段列表,这意味着该值是动态的。因此,一种可能的解决方案是将响应正文解析为 JSON 对象。我试图使用response.errorBody().string()

@Override
public void onResponse(final Call<Category> call, final Response<Category> response) {
    if (response.isSuccessful()) {

    } else {
        // Handle error
        String errorBody = response.errorBody().string();
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,打印errorBody我只能得到以下结果 {"success":false,"error":{"message":{"name":[""]}}} Retrofit 限制了 errorBody 对象深度吗?我应该怎么做才能获得可以解析的完整响应主体?

android retrofit retrofit2

5
推荐指数
2
解决办法
6895
查看次数

改造:出现错误 ** 第 1 行第 1 列输入结束**

我不知道我的问题出在哪里。我必须发布原始的身体

{"app_id":"abced","app_key":"abced","request":"login","username":"abce@gmail.com","password":"1234"}
Run Code Online (Sandbox Code Playgroud)

我正在使用改造 2.0。我创建了一个界面

    @FormUrlEncoded
@POST("index.php/")
Call<LoginResponse> getHome(@Field("app_id") String request,
                            @Field("app_key") String request1,
                            @Field("request") String request2,
                            @Field("username") String request3,
                            @Field("password") String request4);
Run Code Online (Sandbox Code Playgroud)

并像这样调用:

 Retrofit retrofitget = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        MyAPI ApiData = retrofitget.create(MyAPI.class);
        Call<LoginResponse> GalleryGetSet = ApiData.getHome("abced","abced","login","abce@gmail.com","1234");
        GalleryGetSet.enqueue(new Callback<LoginResponse>() {
            @Override
            public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
                Log.e(TAG, "data1" + response.body().getError());
            }

            @Override
            public void onFailure(Call<LoginResponse> call, Throwable t) {
                Log.e(TAG, "Error2" + t.getMessage());
            }
        });
Run Code Online (Sandbox Code Playgroud)

总是出错:第 1 行第 1 列的输入结束 通过改装帖子发布原始身体数据的过程是否正确,或者我错了。已经谷歌它但没有得到我的解决方案。请任何人帮助我。

在界面上也是这样试的

@FormUrlEncoded …
Run Code Online (Sandbox Code Playgroud)

post android retrofit retrofit2

4
推荐指数
1
解决办法
1万
查看次数

Retrofit/OkHttp3 400错误主体空

我在我的Android项目中使用Retrofit 2.当我使用GET方法命中API端点并返回400级错误时,我可以在使用HttpLoggingInterceptor时看到错误内容,但是当我到达Retrofit OnResponse回调时,错误正文的字符串为空.

我可以看到错误有一个体,但是在Retrofit回调的上下文中我似乎无法拉出那个体.有没有办法确保身体在那里可以进入?

谢谢,亚当

编辑:我从服务器看到的响应是:{"error":{"errorMessage":"对于输入字符串:\"000001280_713870281 \"","httpStatus":400}}

我试图通过以下方式从响应中获取响应: BaseResponse baseResponse = GsonHelper.getObject(BaseResponse.class, response.errorBody().string()); if (baseResponse != null && !TextUtils.isEmpty(baseResponse.getErrorMessage())) error = baseResponse.getErrorMessage();

(GsonHelper只是一个帮助器,通过GSON传递JSON字符串来拉出类型的对象BaseResponse)

对response.errorBody().string()的调用导致IOException:Content-Length和流长度不一致,但我在Log Cat中看到的内容字面上是2行

android retrofit2 okhttp3

4
推荐指数
1
解决办法
2258
查看次数

Retrofit 2.0.2获取错误字符串体

我使用Retrofit 2.0.2,我无法获取错误体json并转换它.这是我的代码:

public RestClient() {
    retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    apiInterface = retrofit.create(ApiInterface.class);
}

        @FormUrlEncoded
    @POST("users/login")
    Call<Person> login(@FieldMap Map<String, String> map);

    private void login(Map<String, String> map) {
    Call<Person> call = restClient.getApiInterface().login(map);

    Log.d("Login_call", call.request().toString());

    call.enqueue(new Callback<Person>() {
        @Override
        public void onResponse(Call<Person> call, Response<Person> response) {
            Log.d("Login_call", response.isSuccessful() + " " + response.message());
            if (response.isSuccessful()) {
                Log.d("Login_call", response.body().toString());
                //editor.putString("user", new Gson().toJson(response.body()));
                //editor.apply();
            }
            else {
                Log.d("Login_call", response.errorBody().toString());
            }
        }

        @Override
        public void onFailure(Call<Person> call, Throwable t) {
            Log.d("Login_call_fail", "Fail");
        } …
Run Code Online (Sandbox Code Playgroud)

android retrofit

-3
推荐指数
1
解决办法
6173
查看次数

如何在后台线程中运行改造?

界面:我输入单词到文本然后单击按钮并在输出中输出结果

public interface Link {
    @FormUrlEncoded//?????????
    @POST("https://translate.yandex.net/api/v1.5/tr.json/translate")
    Call<Object> translate(@FieldMap Map<String,String> map); 
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如何在后台线程中运行改造?

我输入单词到文本,然后单击按钮,在输出结果,简单的翻译,我测试这个库

java android retrofit

-3
推荐指数
1
解决办法
3969
查看次数

标签 统计

android ×7

retrofit ×6

retrofit2 ×4

error-handling ×1

http ×1

java ×1

okhttp3 ×1

post ×1