Обновление Кажется, что проблема связана с тем, как даты интерпретируются путем модернизации и весны. Запрос работает, когда дата установлена в значение null.Retrofit возвращает Http-код 400
Я пытаюсь отправить запрос POST с android, используя retrofit2, на мой серверный сервер, работающий на Spring. Я получаю код 400 Bad Request и не могу найти причину этого. Я попробовал контроллер весны с пользовательским интерфейсом swagger, и он работал нормально, поэтому я предполагаю, что проблема с андроидами - проблема.
Android сторона:
//this is inside Async task, there's 1 more retrofit call above
UserTemplate template;
// fill template
UserService userService = (UserService) RetrofitBuilder.getService(UserService.class,
RetrofitBuilder.BASE_URL);
Call<User> userCall = userService.register(template);
Response<User> registeredUser;
try {
registeredUser = userCall.execute();
} catch (IOException e) {
e.printStackTrace();
return null;
}
Log.d("call", "call status " + registeredUser.code());
return registeredUser.body();
}
//---------------------------------------------------------
public class RetrofitBuilder {
public static final String BASE_URL = "http://my-backend-url.com/";
public static final String IMGUR_URL = "https://api.imgur.com/";
/**
* Added logging
*/
public static Retrofit build(String url) {
GsonBuilder builder = new GsonBuilder();
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return new Date(json.getAsJsonPrimitive().getAsLong());
}
});
Gson gson = builder.create();
return new Retrofit.Builder()
.client(client)
.baseUrl(useLocalhost ? LOCALHOST : url)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
public static Object getService(Class<?> clas, String url) {
return build(url).create(clas);
}
}
//----------------------------------------------------
public interface UserService {
@POST("/register/")
Call<User> register(@Body UserTemplate userTemplate);
}
И весна сторона:
@RestController
public class RegisterController {
@Autowired
UserService userService;
@RequestMapping(value = "register", method = RequestMethod.POST)
public ResponseEntity<?> register(@RequestBody UserTemplate userTemplate) {
User user = UserMapper.map(userTemplate);
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
user.setPassword(passwordEncoder.encode(user.getPassword()));
User u = userService.register(user);
return ResponseEntity.ok().body(u);
}
UserTemplate
public class UserTemplate {
String firstName;
String lastName;
String email;
String username;
String password;
float targetDistance;
String notifications;
Date dateOfBirth;
String description;
String profilePicture;
//getters, setters, toString
}
OkHttp войти
D/OkHttp: --> POST http://mafia-test-env-java.eu-central-1.elasticbeanstalk.com/register http/1.1
D/OkHttp: Content-Type: application/json
D/OkHttp: Content-Length: 168
D/OkHttp: {"dateOfBirth":"Aug 21, 2016 12:00:00 AM","email":"[email protected]","firstName":"A","lastName":"A","password":"a","profilePicture":"IyYD8uY","username":"a","targetDistance":0.0}
D/OkHttp: --> END POST (168-byte body)
D/OkHttp: <-- 400 Bad Request http://mafia-test-env-java.eu-central-1.elasticbeanstalk.com/register (192ms)
D/OkHttp: Server: nginx/1.8.1
D/OkHttp: Date: Sun, 21 Aug 2016 20:28:02 GMT
D/OkHttp: Content-Type: application/json;charset=UTF-8
D/OkHttp: Transfer-Encoding: chunked
D/OkHttp: Connection: keep-alive
D/OkHttp: Access-Control-Allow-Origin: *
D/OkHttp: Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS, DELETE
D/OkHttp: Access-Control-Max-Age: 3600
D/OkHttp: Access-Control-Allow-Headers: Origin, X-Requested-With, Content- Type, Accept, ${cerberus.token.header}
D/OkHttp: X-Content-Type-Options: nosniff
D/OkHttp: X-XSS-Protection: 1; mode=block
D/OkHttp: Cache-Control: no-cache, no-store, max-age=0, must-revalidate
D/OkHttp: Pragma: no-cache
D/OkHttp: Expires: 0
D/OkHttp: X-Frame-Options: DENY
D/OkHttp: <-- END HTTP (binary 1408-byte body omitted)
D/call: call status =400, message =Bad Request
Прошу просветить меня.
Не могли бы вы также добавить описание класса UserTemplate. –
@ArtemNovikov ok, добавлено. – Asalas77
Какой у вас настоящий BASE_URL? Действительно ли «/ register /» находится в корне? –