我正在使用Retrofit和Robospice在我的Android应用程序中进行API调用.所有的@POST方法都很有用,所以@GET命令在URL中没有任何参数也是如此,但是我无法获得任何@GET调用来使用参数!
例如,如果我的API路径是"my/api/call /"并且我想在URL中使用2个参数"param1"和"param2",那么get调用将如下所示:
http://www.example.com/my/api/call?param1=value1m2=value2
所以我设置了我的@GET界面,如下所示:
@GET("/my/api/call?param1={p1}¶m2={p2}")
Response getMyThing(@Path("p1")
String param1, @Path("p2")
String param2);
Run Code Online (Sandbox Code Playgroud)
但我得到一个错误,说
"请求网络执行期间发生异常:URL查询字符串" /my/api/call?param1={p1}¶m2={p2}"方法getMyThing可能没有替换块."
我究竟做错了什么?
我希望从URL中获取RSS代码Retrofit,如果我在get注释中静态输入url,一切正常,但是使用动态URL我得到一个错误.
我的界面服务:
public interface AllNewsService {
@GET("/fa/rss/{url}")
void getRss( @Path("url") String nGroup , Callback<AllNewsRss> callback);}
Run Code Online (Sandbox Code Playgroud)
并调用getRss方法:
DataGetter dg = new DataGetter();
dg.get().getRss("allnews" ,new Callback<AllNewsRss>() {
@Override
public void success(AllNewsRss allNewsRss, Response response) {
Log.d(TAG,"success");
}
@Override
public void failure(RetrofitError error) {
Log.d("*********",error.toString());
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
retrofit.RetrofitError: AllNewsService.getRss: No Retrofit annotation found. (parameter #1)
Run Code Online (Sandbox Code Playgroud)
注意:我在下面添加了一行,proguard.cfg但它没有用
-keep class retrofit.** { *; }
Run Code Online (Sandbox Code Playgroud) 我使用的API使用授权方案,该方案需要设置特殊的"X-Authorization"标头来验证请求.例如,此Retrofit设置适用于其身份验证令牌为的用户abc123:
@Headers("X-Authorization: abc123")
@GET("/posts")
Observable<List<Post>> get_posts();
Run Code Online (Sandbox Code Playgroud)
我缓存了用户的X-Authorization令牌,所以我可以访问它,但是,我不能把它放在@Headers声明中.
@Headers("X-Authorization: " + token)
@GET("/posts")
Observable<List<Post>> get_posts();
Run Code Online (Sandbox Code Playgroud)
我在这里得到一个编译错误: Error:(41, 34) error: element value must be a constant expression
关于如何解决这个问题的任何想法?
我试图通过使用拦截器在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;
} …Run Code Online (Sandbox Code Playgroud) 在过去的几周里,我们的客户开始看到100个这样的"SSLException错误 - 连接重置连接",我无法弄清楚为什么
我们在okhttp上使用Retrofit,没有特殊配置
public class OkHttpClientProvider implements IOkHttpClientProvider {
OkHttpClient okHttpClient;
public OkHttpClientProvider() {
this.okHttpClient = createClient();
}
public OkHttpClient getOkHttpClient() {
return this.okHttpClient;
}
private OkHttpClient createClient() {
return new OkHttpClient();
}
}
Run Code Online (Sandbox Code Playgroud)上述客户提供商是单身人士.RestAdapter是使用这个注入的客户端构建的(我们使用匕首) -
RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder()
.setConverter(converter)
.setEndpoint(networkRequestDetails.getServerUrl())
.setClient(new OkClient(okHttpClientProvider.getOkHttpClient()))
.setErrorHandler(new NetworkSynchronousErrorHandler(eventBus))
);
Run Code Online (Sandbox Code Playgroud)
基于堆栈溢出解决方案,我发现了 -
服务器上的保持活动持续时间为180秒,OkHttp的默认值为300秒
服务器在其标头中返回"Connection:close",但客户端请求发送"Connection:keepAlive"
服务器支持TLS 1.0/1.1/1.2并使用Open SSL
我们的服务器最近已转移到另一个托管服务提供商的另一个地理位置,因此我不知道这些是否是DNS故障
我们尝试调整keepAlive之类的东西,在服务器上重新配置OpenSSL,但由于某种原因,Android客户端不断收到此错误
当您尝试使用应用程序发布内容或拉动刷新时,它会立即发生,并且不会出现任何延迟(在发生此异常之前,它甚至不会进入网络或延迟,这意味着连接已经断开).但尝试多次以某种方式"修复它",我们取得了成功.它会在以后再次发生
我们已经在服务器上使我们的DNS条目无效,看看这是否是由它引起的,但是没有帮助
它主要发生在LTE上,但我也在Wifi上看过它
我不想禁用keep alive,因为大多数现代客户都不这样做.此外,我们正在使用OkHttp 2.4,这是后冰淇淋三明治设备的一个问题,所以我希望它应该照顾这些潜在的网络问题.iOS客户端也获得了这些例外但接近100倍(iOS客户端使用AFNetworking 2.0).我正在努力寻找新的东西,在这一点上尝试,任何帮助/想法?
更新 - 通过okhttp添加完整堆栈跟踪
retrofit.RetrofitError: Read error: ssl=0x9dd07200: I/O error during system call, Connection reset by …Run Code Online (Sandbox Code Playgroud) 我知道这不是第一次有人问这个问题,但是使用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();
}
Run Code Online (Sandbox Code Playgroud)
客户代码:
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()); …Run Code Online (Sandbox Code Playgroud) 我使用查询参数来设置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);
Run Code Online (Sandbox Code Playgroud)
改造产生:
&address=90210&sensor=false&client=gme-client&signature=signkey
Run Code Online (Sandbox Code Playgroud)
当我需要它时,会导致调用失败
address=90210&sensor=false&client=gme-client&signature=signkey
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
我想使用改装2从我的api获取字符串json,使用改装1获取此json时我没有问题,但使用retrofit 2 为我返回null.
这就是我的json的样子
{"id":1,"Username":"admin","Level":"Administrator"}
Run Code Online (Sandbox Code Playgroud)
这是我的API
@FormUrlEncoded
@POST("/api/level")
Call<ResponseBody> checkLevel(@Field("id") int id);
Run Code Online (Sandbox Code Playgroud)
这就是我的代码的样子
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) {
}
});
Run Code Online (Sandbox Code Playgroud)
我是新手改造2并使用上面的代码,它总是让我的应用程序崩溃因为response.body().toString()返回null.
请指导我如何获取json字符串,以便将其转换为JsonObject.
我有以下代码:
@GET("api.php?company_name={name}")
Call<Model> getRoms_center(@Query("name") String name);
Run Code Online (Sandbox Code Playgroud)
根据官方文档,我必须使用@Query,我正在使用它,但我收到以下错误:
java.lang.IllegalArgumentException: URL query string "company_name={name}" must not have replace block. For dynamic query parameters use @Query.
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Retrofit2,我想添加Token到我的Header喜欢这个:
Authorization: Bearer Token
但code下面不起作用:
public interface APIService {
@Headers({"Authorization", "Bearer "+ token})
@GET("api/Profiles/GetProfile?id={id}")
Call<UserProfile> getUser(@Path("id") String id);
}
Run Code Online (Sandbox Code Playgroud)
我的服务器asp.net webApi
请帮忙我该怎么办?