使用PUT时,RetroFit 2会变形URL

时间:2016-03-11 07:24:31

标签: android retrofit2

我有一个改装2 api。我的界面如下:

public interface Api {

    ...

    @Headers({"Content-Type: application/json"})
    @POST("/api/Login")
    Call<User> login(@Body LoginRequest loginRequest);

    @Headers({"Content-Type: application/json"})
    @PUT("/api/User/{id}")
    Call<User> updateDetails(@Path("id") String parentId, @Header("Cookie") String session, @Body UpdateProfileRequest profileDataRequest);
}

我按如下方式创建我的Webservice实例:

private static final Retrofit getAdapter() {
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient httpClient = new OkHttpClient();
    httpClient.interceptors().add(logging);

    String url = String.format("http://%s:%s", BuildConfig.SERVER, BuildConfig.PORT);
    return new Retrofit.Builder()
            .baseUrl(url)
            .client(httpClient)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
}

现在,当我调用LOGIN(GET)或REGISTER(POST)时,它可以正常工作。但是当我调用PUT方法时,它会使URL出错:

  

响应{protocol = http / 1.1,代码= 404,消息=未找到,网址= http://.../Account/Unauthorized/?ReturnUrl=%2Fapi%2FUser%2F9e5851bc-3f98-4e7c-82f7-b5ec805b53f6}

我尝试将其设为POST,然后它不会使URL格式错误,但显然它不起作用,因为它需要是PUT。我已经调试了,我正在保存cookie和id数据。

以防这是我的图书馆:

compile 'com.squareup.retrofit:retrofit:2.0.0-beta4'
compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'
compile 'com.squareup.okhttp3:okhttp:3.0.1'
compile 'com.squareup.okhttp3:mockwebserver:3.0.1'

compile 'com.squareup.okio:okio:1.6.0'
compile 'com.google.code.gson:gson:2.4'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-moshi:2.0.0-beta2'
compile 'com.squareup:seismic:1.0.2'

修改
logcat的:

  

D / OkHttp: - &gt; PUT / api / User / f475b862-xxxx-xxxx-a1e7-3309d5f2be11 HTTP / 1.1   03-14 11:02:45.905 25738-26269 / app.com D / OkHttp:Cookie:.AspNet.MyCookieMiddlewareInstance = cookiedata;路径= /;仅Http
  03-14 11:02:45.905 25738-26269 / app.com D / OkHttp:{&#34; email&#34;:&#34; user@email.com" ;,&#34; id&#34; :&#34; f475b862-xxxx-xxxx-a1e7-3309d5f2be11&#34;,&#34; name&#34;:&#34; Joe Soap&#34;,&#34;密码&#34;:&#34; ....&#34;}
  03-14 11:02:45.905 25738-26269 / app.com D / OkHttp: - &gt; END PUT(124字节体)
  03-14 11:02:45.930 25738-25796 / app.com W / EGL_emulation:eglSurfaceAttrib未实现
  03-14 11:02:45.930 25738-25796 / app.com W / OpenGLRenderer:无法在表面0xa0171a00上设置EGL_SWAP_BEHAVIOR,错误= EGL_SUCCESS
  03-14 11:02:47.748 25738-26269 / app.com D / OkHttp:&lt; - 找不到HTTP / 1.1 404(1842ms)
  03-14 11:02:47.748 25738-26269 / app.com D / OkHttp:服务器:nginx / 1.4.6(Ubuntu)
  03-14 11:02:47.748 25738-26269 / app.com D / OkHttp:日期:星期一,2016年3月14日08:58:02 GMT
  03-14 11:02:47.748 25738-26269 / app.com D / OkHttp:内容类型:text / html
  03-14 11:02:47.748 25738-26269 / app.com D / OkHttp:转移编码:分块
  03-14 11:02:47.748 25738-26269 / app.com D / OkHttp:连接:保持活着
  03-14 11:02:47.748 25738-26269 / app.com D / OkHttp:OkHttp-Selected-Protocol:http / 1.1
  03-14 11:02:47.748 25738-26269 / app.com D / OkHttp:OkHttp-Sent-Millis:1457946167561
  03-14 11:02:47.748 25738-26269 / app.com D / OkHttp:OkHttp-Received-Millis:1457946167747
  03-14 11:02:47.749 25738-26269 / app.com D / OkHttp:&lt; - 结束HTTP(177字节正文)

从这里看起来它正确地格式化了URL,但是当我从RetroFit获取响应对象时,它就是乱码。

1 个答案:

答案 0 :(得分:0)

事实证明,内部服务器正在将一个坏令牌重定向到一个不存在的坏令牌页面。这导致了404.RustalFit工作正常。

我通过查看请求在服务器中所采用的路径找到了这个。