我正在使用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对象中的每个字段,但无法在任何地方找到它.我还需要做些什么吗?
我正在使用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) 我正在使用 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 对象深度吗?我应该怎么做才能获得可以解析的完整响应主体?
我不知道我的问题出在哪里。我必须发布原始的身体
{"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) 我在我的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行
我使用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) 界面:我输入单词到文本然后单击按钮并在输出中输出结果
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)
如何在后台线程中运行改造?
我输入单词到文本,然后单击按钮,在输出结果,简单的翻译,我测试这个库