You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Retrofit发起POST请求时遭遇500错误求助

Retrofit POST请求返回500错误:"is not a valid display name in myserver.domain"

问题描述

我正在用Retrofit集成一个POST登录API,目前能收到onResponse回调,但返回的是500错误码。查看response.errorBody()得到错误信息:is not a valid display name in myserver.domain。

以下是我的相关代码:

API调用代码

public void attemptLogin(final String email, final String password) {
 WebApi api = mRetrofit.create(WebApi.class);
 Call<LoginModel> call = api.attemptLogin("eng", email, password);
 call.enqueue(new Callback<LoginModel>() {
 @Override
 public void onResponse(Call<LoginModel> call, Response<LoginModel> response) {
 String name = "abdul";
 }
 @Override
 public void onFailure(Call<LoginModel> call, Throwable t) {
 String name = "abdul";
 }
 });
}

WebApi接口定义

@FormUrlEncoded
@POST("api/Login")
Call<LoginModel> attemptLogin(
 @Field("language") String language,
 @Field("email") String email,
 @Field("password") String password
 );

Retrofit实例化代码

public WebServiceManager() {
 Gson gson = new GsonBuilder()
 .setLenient()
 .create();
 mRetrofit = new Retrofit.Builder()
 .baseUrl(AppConstants.BASE_URL)
 .addConverterFactory(GsonConverterFactory.create(gson))
 .build();
}

可能的原因及解决方案

这个500错误的提示指向“display name”无效,结合你的代码,我整理了几个常见的排查方向:

1. 服务器API期望额外的必填参数

首先核对服务器端的Login接口文档,确认是否需要除language、email、password之外的其他参数(比如display_name)。如果服务器要求必须提交这个字段,但你的请求中没有包含,就会触发服务器内部错误。

解决方法:
如果确实缺少参数,修改WebApi接口的attemptLogin方法,添加对应的@Field参数:

@FormUrlEncoded
@POST("api/Login")
Call<LoginModel> attemptLogin(
 @Field("language") String language,
 @Field("email") String email,
 @Field("password") String password,
 @Field("display_name") String displayName // 添加缺失的字段
 );

然后在调用时传入对应的参数值。

2. Language参数值不符合服务器预期

你传入的language值是"eng",但很多服务器期望语言代码遵循ISO 639-1标准(比如"en"代表英语)。如果服务器无法识别"eng",可能会导致处理逻辑出错,抛出这个错误。

解决方法:
尝试将"eng"替换为"en",看看请求是否正常:

Call<LoginModel> call = api.attemptLogin("en", email, password);

3. 请求缺少合法的User-Agent头

部分服务器会验证请求的User-Agent头,若请求没有携带该头,或者头内容被服务器判定为“无效的display name”,也会触发这类错误。Retrofit默认的User-Agent可能不符合服务器的要求。

解决方法:
给Retrofit配置OkHttpClient,添加拦截器设置合法的User-Agent:

public WebServiceManager() {
 Gson gson = new GsonBuilder()
 .setLenient()
 .create();

 // 添加OkHttpClient并设置User-Agent
 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", "YourAppName/1.0.0") // 替换为你的应用名称和版本
                 .build();
             return chain.proceed(modifiedRequest);
         }
     })
     .build();

 mRetrofit = new Retrofit.Builder()
 .baseUrl(AppConstants.BASE_URL)
 .client(client) // 绑定自定义客户端
 .addConverterFactory(GsonConverterFactory.create(gson))
 .build();
}

4. 用工具模拟请求排查问题

建议用Postman或curl模拟相同的POST请求,验证是否能成功:

curl -X POST -d "language=eng&email=your-test-email@example.com&password=your-test-password" https://myserver.domain/api/Login

如果工具请求也返回相同错误,说明问题出在请求参数或服务器要求的规则上;如果工具请求成功,那问题大概率在Retrofit的请求配置(比如头信息)上。


内容的提问来源于stack exchange,提问作者Abdul Waheed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:02:37