javascript

java

python

c#

android

c++

node.js

php

reactjs

jquery

html

css

ios

.net

git

ruby-on-rails

sql

c

string

ruby

如何使用Retrofit从异步回调返回String或JSONObject?

例如,打电话

api.getUserName(userId, new Callback<String>() {...});

原因:

retrofit.RetrofitError: retrofit.converter.ConversionException:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 
Expected a string but was BEGIN_OBJECT at line 1 column 2

我认为我必须禁用将gson解析为POJO的方式,但无法弄清楚该怎么做。

trans by 2020-07-08T19:40:44Z

java-带承载令牌的Retrofit2授权

我正在尝试使用asp.net webApi,我想将code添加到我的Header中,如下所示:

asp.net webApi但是下面的code无法正常工作:

public interface APIService {
    @Headers({"Authorization", "Bearer "+ token})
    @GET("api/Profiles/GetProfile?id={id}")
    Call<UserProfile> getUser(@Path("id") String id);
}

我的服务器是asp.net webApi。请帮助我该怎么办?

trans by 2020-06-30T22:26:23Z

android-如何获取翻新成功响应状态代码

我无法从响应中获得成功响应状态代码,例如200201等。因为我们可以从RetrofitError类(例如error.isNetworkError()error.isNetworkError())中轻松获取错误代码。是否有任何解决方法来获取状态代码?

trans by 2020-06-30T04:31:00Z

具有Retrofit2和Mockito或Robolectri的Android单元测试

我可以测试来自Retrofit2beta4的真实响应吗? 我需要Mockito还是Robolectic?

我的项目中没有活动,它将是一个库,我需要测试服务器是否正确响应。现在我有这样的代码并卡住了...

@Mock
ApiManager apiManager;

@Captor
private ArgumentCaptor<ApiCallback<Void>> cb;

@Before
public void setUp() throws Exception {
    apiManager = ApiManager.getInstance();
    MockitoAnnotations.initMocks(this);
}

@Test
public void test_login() {
    Mockito.verify(apiManager)
           .loginUser(Mockito.eq(login), Mockito.eq(pass), cb.capture());
    // cb.getValue();
    // assertEquals(cb.getValue().isError(), false);
}

我可以做出虚假回应,但我需要测试真实。 成功了吗? 身体正确吗?您能帮我提供代码吗?

trans by 2020-02-13T20:14:04Z

改造2:从响应正文获取JSON

我想使用翻新2从我的api中获取字符串json,当使用翻新1来获取此json时我没有问题,但是使用翻新2为我返回null。

这就是我的json的样子

{"id":1,"Username":"admin","Level":"Administrator"}

这是我的API

@FormUrlEncoded
@POST("/api/level")
Call<ResponseBody> checkLevel(@Field("id") int id);

这就是我的代码的样子

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Config.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        Api api = retrofit.create(Api.class);
        Call<ResponseBody> call = api.checkLevel(1);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                JsonObject post = new JsonObject().get(response.body().toString()).getAsJsonObject();
                    if (post.get("Level").getAsString().contains("Administrator")) {

                    }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });

我是不熟悉2并使用上面的代码的新手,因为response.body().toString()返回null,它总是使我的应用程序崩溃。

请指导我如何获取该json字符串,以便可以将其转换为JsonObject。

trans by 2020-01-16T22:01:52Z

java-Retrofit 2-URL查询参数

我正在使用查询参数来设置Google Maps API所需的值。

问题是我不需要第一个查询参数&符号。

@GET("/maps/api/geocode/json?")
    Call<JsonObject> getLocationInfo(@Query("address") String zipCode,
                                             @Query("sensor") boolean sensor,
                                             @Query("client") String client,
                                             @Query("signature") String signature);

改造产生:

&address=90210&sensor=false&client=gme-client&signature=signkey

这会在我需要时导致呼叫失败

address=90210&sensor=false&client=gme-client&signature=signkey

我该如何解决?

trans by 2020-01-16T09:20:59Z

Java-Retrofit2 Android:应为BEGIN_ARRAY,但位于第1行第2列路径的BEGIN_OBJECT $

我知道这不是第一次有人问这个问题,但是有了Retrofit2,我找不到合适的解决方案。 我遵循了在线教程,效果很好。 当我将相同的代码应用于自己的端点时,出现以下异常:java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $我不知道该如何解决。

接口:

public interface MyApiService {

// Is this right place to add these headers?
@Headers({"application-id: MY-APPLICATION-ID",
        "secret-key: MY-SECRET-KEY",
        "application-type: REST"})
@GET("Music")
Call<List<Music>> getMusicList();



Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(MySettings.REST_END_POINT)
        .addConverterFactory(GsonConverterFactory.create())
        .build();
}

客户代码:

MyApiService service = MyApiService.retrofit.create(MyApiService.class);
Call<List<Music>> call = service.getMusicList();
call.enqueue(new Callback<List<Music>>() {

    @Override
    public void onResponse(Call<List<Music>> call, Response<List<Music>> response) {
        Log.e("MainActivity", response.body().
    }

    @Override
    public void onFailure(Call<List<Music>> call, Throwable t) {
        Log.e("MainActivity", t.toString());
    }
});

此代码与此有效负载一起使用:

[
{
    "login": "JakeWharton",
    "id": 66577,
    "avatar_url": "https://avatars.githubusercontent.com/u/66577?v=3",
    "gravatar_id": "",
    "url": "https://api.github.com/users/JakeWharton",
    "html_url": "https://github.com/JakeWharton",
    "followers_url": "https://api.github.com/users/JakeWharton/followers",
    "following_url": "https://api.github.com/users/JakeWharton/following{/other_user}",
    "gists_url": "https://api.github.com/users/JakeWharton/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/JakeWharton/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/JakeWharton/subscriptions",
    "organizations_url": "https://api.github.com/users/JakeWharton/orgs",
    "repos_url": "https://api.github.com/users/JakeWharton/repos",
    "events_url": "https://api.github.com/users/JakeWharton/events{/privacy}",
    "received_events_url": "https://api.github.com/users/JakeWharton/received_events",
    "type": "User",
    "site_admin": false,
    "contributions": 741
},
{....

但与此不:

{
"offset": 0,
"data": [
    {
        "filename": "E743_1458662837071.mp3",
        "created": 1458662854000,
        "publicUrl": "https://api.backendless.com/dbb77803-1ab8-b994-ffd8-65470fa62b00/v1/files/music/E743_1458662837071.mp3",
        "___class": "Music",
        "description": "",
        "likeCount": 0,
        "title": "hej Susanne. ",
        "ownerId": "E743756F-E114-6892-FFE9-BCC8C072E800",
        "updated": null,
        "objectId": "DDD8CB3D-ED66-0D6F-FFA5-B14543ABC800",
        "__meta": "{\"relationRemovalIds\":{},\"selectedProperties\":[\"filename\",\"created\",\"publicUrl\",\"___class\",\"description\",\"likeCount\",\"title\",\"ownerId\",\"updated\",\"objectId\"],\"relatedObjects\":{}}"
    },
    {...

我的音乐课:

public class Music {

   private String ownerId;
   private String filename;
   private String title;
   private String description;
   private String publicUrl;
   private int likeCount;

   // Getters & Setters

}
trans by 2020-01-14T11:39:51Z

java-改造2 @path vs @query

我是Retrofit 2库的新手。我读了几篇入门的文章,并设法从RESTful API中获取XML数据而未指定参数。生成XML资源的方法如下。

@GET
@Path("/foods")
@Produces(MediaType.APPLICATION_XML)
public List<FoodPyramid> getFoodPyramid() {
    Session session = HibernateUtil.getSessionFactory().openSession();
    trans = session.beginTransaction();
    List<FoodPyramid> foodList = session.createQuery("from FoodPyramid").list();
    try {
        trans.commit();
        session.close();
    } catch (Exception e) {
        session.close();
        System.err.println("Food Pyramid fetch " + e);
    }
    System.err.println("Am in the food modal. . . . . . . .");
    return foodList;
}

现在,当我尝试在界面中传递参数时

@GET("user/{username}/{password}")
Call<List<UserCredentail>> getUserOuth(@Query("username") String username, @Query("password") String password);  

它无法运行,客户端未接收到任何数据。 我花了一个星期的时间试图修复它,尽管通过使用非参数调用获取了资源。因此尝试将其更改为:

@GET("user/{username}/{password}")
Call<List<UserCredentail>> getUserOuth(@Path("username") String username, @Path("password") String password);  

而且效果很好。 所以我的问题是:何时需要在翻新2中使用@Query@Path注释?

trans by 2020-01-05T14:39:41Z

java-不支持的操作:Android,Retrofit,OkHttp。 在OkHttpClien中添加拦截器

我正在尝试使用拦截器通过Android中的Retrofit 2.0-beta3和OkHttpClient添加基于令牌的身份验证。 但是当我在OkHttpClient中添加拦截器时,我得到UnsupportedOperationException。这是我的代码:在ApiClient.java中

public static TrequantApiInterface getClient(final String token) {
        if( sTreqantApiInterface == null) {

            Log.v(RETROFIT_LOG, "Creating api client for the first time");
            OkHttpClient okClient = new OkHttpClient();

            okClient.interceptors().add(new Interceptor() {
                @Override
                public Response intercept(Interceptor.Chain chain) throws IOException {
                    Request original = chain.request();

                    // Request customization: add request headers
                    Request.Builder requestBuilder = original.newBuilder()
                            .header("Authorization", token)
                            .method(original.method(), original.body());

                    Request request = requestBuilder.build();
                    return chain.proceed(request);
                }
            });

            Retrofit client = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .client(okClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            sTreqantApiInterface = client.create(TrequantApiInterface.class);
        }
        return sTreqantApiInterface;
    }

我像这样使用它:

private void ampFreqTest(){
    String token = getSharedPreferences(getString(R.string.preference_file_key), Context.MODE_PRIVATE)
                        .getString(getString(R.string.key_token), "");

    service = ApiClient.getClient(token);
    //I get an exception on this line:
    Call<List<AmpFreq>> call = service.getUserAmpFreq("1");
    call.enqueue(new Callback<List<AmpFreq>>() {
        @Override
        public void onResponse(Response<List<AmpFreq>> response) {
            Toast.makeText(HomeScreen.this, "Got result", Toast.LENGTH_LONG);

            Log.v(ApiClient.RETROFIT_LOG, "Success api client." + response.message());
            Log.v(ApiClient.RETROFIT_LOG, "Success api client.");
        }
        @Override
        public void onFailure(Throwable t) {
            Toast.makeText(HomeScreen.this, t.getMessage() , Toast.LENGTH_LONG);
            Log.v(ApiClient.RETROFIT_LOG, "Fail api client." + t.getMessage() );
        }
    });
}

但是我得到这个错误:

Process: com.trequant.usman.trequant_android, PID: 14400
java.lang.UnsupportedOperationException at java.util.Collections$UnmodifiableCollection.add(Collections.java:932)
 at com.trequant.usman.trequant_android.api.ApiClient.getClient(ApiClient.java:41)

它给我增加一个新的拦截器的错误,说它不是modifiableCollection,但是interceptors()函数的文档说:/ **

   * Returns a modifiable list of interceptors that observe the full span of each call: from before
   * the connection is established (if any) until after the response source is selected (either the
   * origin server, cache, or both).
   */

我究竟做错了什么? 可能是错误吗?

trans by 2020-01-01T07:05:29Z

android-通过Retrofit 2上传图像时是否可以显示进度栏?

我目前正在使用retrofit 2,我想在服务器上上传一些照片。我知道,较早的版本使用TypedFile类进行上传。 如果要使用进度条,则应重写TypedFile类中的writeTo方法。

使用retrofit 2库时是否可以显示进度?

trans by 2019-09-29T17:45:20Z

android - 如何使用Retrofit 2处理空响应体?

最近我开始使用Retrofit 2,我遇到了解析空响应体的问题。 我有一个服务器只响应http代码而没有响应体内的任何内容。如何只处理有关服务器响应的元信息(标题,状态代码等)?

提前致谢!

trans by 2019-08-01T05:25:25Z

logging - 如何使用Retrofit-Android记录请求和响应正文?

我在Retrofit API中找不到用于记录完整请求/响应主体的相关方法。 一世期待在Profiler中提供一些帮助(但它只提供有关响应的元数据)。 我尝试在Builder中设置日志级别,但这对我没有帮助:

RestAdapter adapter = (new RestAdapter.Builder()).
                setEndpoint(baseUrl).
                setRequestInterceptor(interceptor).
                setProfiler(profiler).
                setClient(client).
                setExecutors(MyApplication.getWebServiceThreadPool()).
                setLogLevel(LogLevel.FULL).
                setLog(new RestAdapter.Log() {
                    @Override
                    public void log(String msg) {
                        Log.i(TAG, msg);
                    }
                }).
                build();

编辑:此代码现在正在运行。 我不知道它为什么不提前工作。 可能是因为我正在使用一些旧版本的改造。

trans by 2019-07-11T14:17:59Z

android - 使用Retrofit 2.0包括imag的POST多部分表格数据

我正在尝试使用Retrofit 2.0对服务器进行HTTP POST

        MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain");
        MediaType MEDIA_TYPE_IMAGE = MediaType.parse("image/*");

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        imageBitmap.compress(Bitmap.CompressFormat.JPEG, 90, byteArrayOutputStream);
        profilePictureByte = byteArrayOutputStream.toByteArray();

    Call<APIResults> call = ServiceAPI.updateProfile(
                RequestBody.create(MEDIA_TYPE_TEXT, emailString),
                RequestBody.create(MEDIA_TYPE_IMAGE, profilePictureByte));

    call.enqueue();

服务器返回错误,指出文件无效。

这很奇怪,因为我试图在iOS上使用相同的格式上传相同的文件(使用其他库),但它上传成功。

我想知道使用Retrofit 2.0上传图像的正确方法是什么?

在上传之前我应该先将它保存到磁盘吗?

谢谢!

P.S。:我已将改装用于其他不包含图像的Multipart请求,并且已成功完成。 问题是当我试图在主体中包含一个字节时。

trans by 2019-06-26T11:42:51Z

缓存 - 使用OKHttp进行改造可以在离线时使用缓存数据

我正在尝试使用Retrofit&amp; OKHttp缓存HTTP响应。 我按照这个要点,结束了这段代码:

File httpCacheDirectory = new File(context.getCacheDir(), "responses");

HttpResponseCache httpResponseCache = null;
try {
     httpResponseCache = new HttpResponseCache(httpCacheDirectory, 10 * 1024 * 1024);
} catch (IOException e) {
     Log.e("Retrofit", "Could not create http cache", e);
}

OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setResponseCache(httpResponseCache);

api = new RestAdapter.Builder()
          .setEndpoint(API_URL)
          .setLogLevel(RestAdapter.LogLevel.FULL)
          .setClient(new OkClient(okHttpClient))
          .build()
          .create(MyApi.class);

这是带有Cache-Control标头的MyApi

public interface MyApi {
   @Headers("Cache-Control: public, max-age=640000, s-maxage=640000 , max-stale=2419200")
   @GET("/api/v1/person/1/")
   void requestPerson(
           Callback<Person> callback
   );

首先,我在线请求并检查缓存文件。 有正确的JSON响应和标题。 但是当我尝试离线请求时,我总是得到HttpResponseCache.我还有什么办法让Retrofit从缓存中读取响应吗?

编辑:由于OKHttp 2.0.x HttpResponseCacheCache,setResponseCachesetCache

trans by 2019-05-25T21:44:41Z

java - Retrofit 2.0如何获得反序列化的错误响应.body

我正在使用Retrofit 2.0.0-beta1。

在测试中,我有一个替代方案,并期望错误HTTP 400

我想要retrofit.Response<MyError> response但是response.body() == null

MyError没有反序列化 - 我只在这里看到它

response.errorBody().string()

但它没有给我MyError作为对象

trans by 2019-04-23T15:11:13Z

java - 使用Retrofit 2进行日志记录

我正在尝试获取请求中发送的确切JSON。 这是我的代码:

OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor(){
   @Override public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
      Request request = chain.request();
      Log.e(String.format("\nrequest:\n%s\nheaders:\n%s",
                          request.body().toString(), request.headers()));
      com.squareup.okhttp.Response response = chain.proceed(request);
      return response;
   }
});
Retrofit retrofit = new Retrofit.Builder()
   .baseUrl(API_URL)
   .addConverterFactory(GsonConverterFactory.create())
   .client(client).build();

但我只在日志中看到这个:

request:
com.squareup.okhttp.RequestBody$1@3ff4074d
headers:
Content-Type: application/vnd.ll.event.list+json

鉴于删除了我们曾经用于改造1的setLog()setLogLevel(),我该如何进行适当的记录?

trans by 2019-02-24T22:20:47Z

1 共1页