我有一个改装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获取响应对象时,它就是乱码。
答案 0 :(得分:0)
事实证明,内部服务器正在将一个坏令牌重定向到一个不存在的坏令牌页面。这导致了404.RustalFit工作正常。
我通过查看请求在服务器中所采用的路径找到了这个。