Retrofit 2登录POST请求返回500错误但Postman可正常运行
Retrofit 2 POST登录返回500错误(Postman正常)的排查与解决
我帮你梳理几个大概率能解决问题的方向——毕竟Postman能跑通说明接口本身没问题,问题大概率出在Retrofit的请求配置和Postman不一致上:
1. 核对请求头是否完全匹配
Postman里的所有请求头(比如User-Agent、自定义标识头、甚至Cookie),都要确保Retrofit请求里也同步带上。很多服务器会因为缺失特定头返回500,你可以给OkHttpClient加个拦截器统一补全:
OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); Request modifiedRequest = originalRequest.newBuilder() .header("User-Agent", "你的App名称/版本") // 把Postman里的其他请求头都复制过来 .build(); return chain.proceed(modifiedRequest); } }) .build();
2. 检查参数编码与格式细节
虽然你用了@FormUrlEncoded,但要确认:
- 参数名
_username和_password的大小写、下划线完全和接口文档一致,别漏了下划线 - 如果参数值包含特殊字符(中文、空格、符号),确认Retrofit的编码方式和Postman一致。可以尝试手动对参数做URL编码后再传入
3. 打印完整请求日志对比Postman
给Retrofit加个日志拦截器,把请求的URL、头、参数全打出来,和Postman的请求逐行对比,差异点一找一个准:
// 先添加依赖:com.squareup.okhttp3:logging-interceptor HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build();
然后看Logcat里的请求详情,和Postman的请求对比,就能发现哪里不一样。
4. 读取服务器返回的错误详情
在回调里打印errorBody的内容,服务器通常会在500错误里返回具体的报错原因:
call.enqueue(new Callback<JsonObject>() { @Override public void onResponse(Call<JsonObject> call, Response<JsonObject> response) { if (!response.isSuccessful()) { try { // 打印服务器返回的错误信息 String errorContent = response.errorBody().string(); Log.e("LoginDebug", "服务器错误详情:" + errorContent); } catch (IOException e) { e.printStackTrace(); } return; } // 处理成功逻辑 } @Override public void onFailure(Call<JsonObject> call, Throwable t) { t.printStackTrace(); } });
如果以上都排查完还是有问题,建议找后端同事看看服务器的500错误日志,能直接定位到是参数解析失败、权限校验问题还是其他逻辑报错。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

