HTTP Post запрос с типом контента application / x-www-form-urlencoded не работает в сервисе загрузки Spring - PullRequest
0 голосов
/ 02 декабря 2018

Я новичок в весенней загрузке. Я пытаюсь выполнить HTTP-запрос POST от одного приложения для Android через библиотеку API retrofit2 rest с закодированной программой application / x-www-form-url, но когда я нажимаю на службу POST для весенней загрузки, она показывает мнениже ошибка

"статус": 415, "ошибка": "неподдерживаемый тип носителя", "исключение": "org.springframework.web.HttpMediaTypeNotSupportedException", "message": приложение "Тип содержимого"/ x-www-form-urlencoded; charset = UTF-8 «не поддерживается», «путь»: «/ api / login»

enter image description here

Может кто-нибудь знает, как ее решить?

Вот мой код Пример кода Android

ApiService.java

public interface ApiService {
    @FormUrlEncoded
    @POST("/api/login")
    Call<LoginData> postLogIn(
            @Field("username") String username,
            @Field("password") String password);
}

ApiHandler.java

    private static final String SERVER_URL = "http://192.168.0.12:8080/";
    private static final long CONNECTION_TIMEOUT = 30;
    public static Retrofit restAdapter;

    //public static final int CONNECTION_TIME_OUT = 120;
    private static Retrofit getRestAdapter() {
        if (restAdapter == null) {
            restAdapter = new Retrofit.Builder()
                    .baseUrl(SERVER_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(getClient()).build();
        }
        return restAdapter;
    }

    private static OkHttpClient getClient() {
        OkHttpClient.Builder okClientBuilder = new OkHttpClient.Builder();
        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        okClientBuilder.addInterceptor(httpLoggingInterceptor);
        okClientBuilder.connectTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS);
        okClientBuilder.readTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS);
        okClientBuilder.writeTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS);
        return okClientBuilder.build();
    }

PostHandler.java

@Override
    public void callAPI(final Context context, final ApiClientResponse callback, Object arg0) {
        this.callback = callback;
        apiService.postLogIn(Login.username, Login.password).enqueue(new Callback<LoginData>() {
            @Override
            public void onResponse(Call<LoginData> call, Response<LoginData> response) {
                if (response.isSuccessful()) {
                    LoginData loginData = response.body();
                    successLoginData = loginData;
                    successCallBack();
                } else {
                    ApiErrorHandler.handleError(context, response, errorResponse);
                }
            }

            @Override
            public void onFailure(Call<LoginData> call, Throwable t) {
                ApiErrorHandler.handleError(context, t, errorResponse);
            }

            RetrofitErrorResponse errorResponse = new RetrofitErrorResponse() {
                @Override
                public void errorMessage(String errorMessage) {
                    failureCallBack(errorMessage);
                }

                @Override
                public void tSyncError() {

                }

                @Override
                public void invalidTokenError() {

                }
            };

        });
    }

Класс модели LoginData.java

@Generated("org.jsonschema2pojo")
public class LoginData {
    @SerializedName("access_token")
    @Expose
    private String accessToken;
    @SerializedName("token_type")
    @Expose
    private String tokenType;
    @SerializedName("refresh_token")
    @Expose
    private String refreshToken;
    @SerializedName("expires_in")
    @Expose
    private long expiresIn;
    @SerializedName("scope")
    @Expose
    private String scope;

    // getter setter 
}

Вот моя весенняя загрузкапример кода приложения

MainApplicationClass.java

@SpringBootApplication
public class MainApplicationClass {
    public static void main(String[] args) {
        SpringApplication.run(MainApplicationClass.class, args);
    }
}

Controller.java

@RestController
public class BlogController {
    @Autowired
    BlogRespository blogRespository;
    BlogMockedData blogMockedData = BlogMockedData.getInstance();

    @GetMapping("/blog")
    public List<Blog> index() {
        return blogMockedData.fetchBlogList();
    }

    @GetMapping("/blog/{id}")
    public Blog show(@PathVariable String id) {
        int blogId = Integer.parseInt(id);
        return blogMockedData.getBlogById(blogId);
    }

    @PostMapping(value = "/api/login",
            consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_FORM_URLENCODED_VALUE},
            produces = {MediaType.APPLICATION_JSON_UTF8_VALUE, MediaType.APPLICATION_JSON_VALUE}
    )
    public LoginData postLogin(@RequestBody Map<String, String> body) {
        String userName = body.get("username");
        String password = body.get("password");
        return blogMockedData.getLoginToken(userName, password);
    }

ПРИМЕЧАНИЕ: Если я нажму на sprЗагрузив POST-сервис из POSTMAN, я получаю результат ниже

enter image descriptiIn here

Но если я нажму POST-сервис со стороны моего клиента Android, он получит ошибку

«статус»: 415, «ошибка»: «неподдерживаемый тип носителя», «исключение»: «org.springframework.web.HttpMediaTypeNotSupportedException», «message»: «тип содержимого» application / x-www-form-urlencoded; charset = UTF-8 'не поддерживается "," путь ":" / api / login "

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

При использовании application / x-www-form-urlencoded Spring не воспринимает это как RequestBody.Итак, удалите аннотацию @RequestBody в списке параметров ваших отображенных данных, как я вижу там.

Пожалуйста, прочитайте это Spring не понимает application / x-www-form-urlencoded

0 голосов
/ 02 декабря 2018

Чтобы Spring правильно загружал закодированные данные, вам необходимо определить параметр конечной точки следующим образом:

public LoginData postLogin(@RequestBody MultiValueMap<String, String> body)

или

public LoginData postLogin(@RequestParam Map<String, String> body)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...