2016-08-21 11 views
0

Обновление Кажется, что проблема связана с тем, как даты интерпретируются путем модернизации и весны. Запрос работает, когда дата установлена ​​в значение 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 

Прошу просветить меня.

+1

Не могли бы вы также добавить описание класса UserTemplate. –

+0

@ArtemNovikov ok, добавлено. – Asalas77

+0

Какой у вас настоящий BASE_URL? Действительно ли «/ register /» находится в корне? –

ответ

1

Веб-сервер (работает на веб-сайте) считает, что поток данных, отправленный клиентом (например, ваш веб-браузер или наш робот CheckUpDown), был «искаженным», т. Е. Полностью не соблюдал протокол HTTP. Таким образом, веб-сервер не смог понять запрос и обработать его.

Я думаю, вы передаете не полностью данные на сервер.

+0

Хорошо, но почему это искажено? Я использую почти тот же метод в другом месте для входа в систему, и он отлично работает. – Asalas77

+0

Возможно, какие-то заголовки? Раздел полезной нагрузки? –