Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >内容类型为application/x-www-form-urlencoded的HTTP Post请求在Spring引导服务中不起作用

内容类型为application/x-www-form-urlencoded的HTTP Post请求在Spring引导服务中不起作用
EN

Stack Overflow用户
提问于 2018-12-02 10:36:44
回答 5查看 19.9K关注 0票数 1

最近我刚开始使用spring引导,我正尝试通过应用程序/x-www-form-url编码的retrofit2 rest库从一个android应用程序执行HTTP请求,但是当我访问我的spring服务时,它显示了下面的错误。

“状态”:415,“错误”:“不支持媒体类型”,"exception":"org.springframework.web.HttpMediaTypeNotSupportedException",“消息”:“内容类型'application/x-www-form-urlencoded;charset=UTF-8‘不受支持”,“路径”:“/api/login”

,有人知道怎么解决吗?

这里是我的代码Android代码示例

ApiService.java

代码语言:javascript
运行
AI代码解释
复制
public interface ApiService {
    @FormUrlEncoded
    @POST("/api/login")
    Call<LoginData> postLogIn(
            @Field("username") String username,
            @Field("password") String password);
}

ApiHandler.java

代码语言:javascript
运行
AI代码解释
复制
    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

代码语言:javascript
运行
AI代码解释
复制
@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模型类

代码语言:javascript
运行
AI代码解释
复制
@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 
}

这里是我的Spring应用程序代码示例

MainApplicationClass.java

代码语言:javascript
运行
AI代码解释
复制
@SpringBootApplication
public class MainApplicationClass {
    public static void main(String[] args) {
        SpringApplication.run(MainApplicationClass.class, args);
    }
}

Controller.java

代码语言:javascript
运行
AI代码解释
复制
@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);
    }

注意:如果我从邮递员那里打弹簧引导邮政服务,我会得到以下结果

但是如果我从我的android客户端点击了邮政服务,它就会给我带来错误。

“状态”:415,“错误”:“不支持媒体类型”,"exception":"org.springframework.web.HttpMediaTypeNotSupportedException",“消息”:“内容类型'application/x-www-form-urlencoded;charset=UTF-8‘不受支持”,“路径”:“/api/login”

EN

回答 5

Stack Overflow用户

发布于 2018-12-02 11:05:21

要使Spring正确加载表单编码的数据,需要将端点参数定义为:

代码语言:javascript
运行
AI代码解释
复制
public LoginData postLogin(@RequestBody MultiValueMap<String, String> body)

代码语言:javascript
运行
AI代码解释
复制
public LoginData postLogin(@RequestParam Map<String, String> body)
票数 2
EN

Stack Overflow用户

发布于 2018-12-03 09:26:06

当使用application/x-www-form-urlencoded时,Spring并不将其理解为RequestBody。因此,删除映射数据的参数列表中的@RequestBody注释,就像我在那里看到的那样。

请阅读这个Spring doesn't understand application/x-www-form-urlencoded

票数 1
EN

Stack Overflow用户

发布于 2021-01-26 16:17:17

在Spring中处理URL编码的帖子(内容-类型:application/x form-urlencoded)

这样做是行不通的:

代码语言:javascript
运行
AI代码解释
复制
    public String processForm(@RequestBody RespFormDTO formDTO, 
HttpServletRequest request, HttpServletResponse response) {

这将起作用:

代码语言:javascript
运行
AI代码解释
复制
public String processForm(RespFormDTO formDTO,
       HttpServletRequest request, HttpServletResponse response) {
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53583369

复制
相关文章
Qt中实现http服务接收POST请求
总体而言,HTTP服务器适用于传统的客户端-服务器通信,每次请求都需要重新建立连接,适合请求响应式的场景。WebSocket服务器适用于需要实时双向通信的场景,适合聊天应用、实时数据更新等。
Linux兵工厂
2023/09/15
1.6K0
Qt中实现http服务接收POST请求
http请求中get和post方法的区别
一般我们在浏览器输入一个网址访问网站都是GET请求;再FORM表单中,可以通过设置Method指定提交方式为GET或者POST提交方式,默认为GET提交方式。
用户7880705
2020/11/06
4.5K0
Https网站中请求Http内容
今天遇到个问题:```Mixed Content: The page at ‘https://*****’ was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint ‘http://*****’. This request has been blocked; the content must be served over HTTPS```
DannyHoo
2020/06/15
23.2K0
HTTP协议中的GET、POST请求方法的区别
HTTP 请求方法有:HEAD、PUT、DELETE、OPTIONS、CONNECT
宣言言言
2019/12/15
4.7K0
GateWay 修改请求内容(post)
在读取body内容时不要使用exchange.getRequest().getBody().subscribe()去实现,可能本人比较菜不知道具体使用方法,如果有人指出请评论
用户10325771
2023/03/01
1.2K0
http请求get与post的区别
他们最直接的区别就是get请求将数据放在url中传输,而post请求是将数据放在request body中传输
许喜朝
2021/03/02
1.2K0
java发送http的get、post请求
转载自 http://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html
qubianzhong
2019/07/01
3.2K0
Http:GET和POST请求的区别
GET和POST请求的区别 GET请求 GET /books/?sex=man&name=Professional HTTP/1.1 Host: www.wrox.com User-Ag
心跳包
2020/08/31
1.5K0
springboot发送http请求,springboot http post json
高久峰
2023/07/02
5580
Http常见请求/响应头Content-type内容类型
Content-type 用来指定不同格式的请求响应信息,俗称MIME媒体类型 常见取值: text/html:HTML格式 text/plain:纯文本格式 text/xml:XML格式 image/gif:gif图片格式 image/jpeg:jpg图片格式 - image/png:png图片格式 application/json:JSON数据格式 application/pdf:pdf格式 application/octet-stream:二进制流数据,一般是文件下载 application/x-w
高大北
2022/06/14
1.2K0
go的入门之路 http Get Post请求
   defer 关键字是总会执行,类似于java try catch finally 代码块
地球流浪猫
2018/08/02
1K0
请求类型 GET 和 POST 的区别
如果像 HTML 表单那样 POST 数据,要用 setRequestHeader() 来添加 HTTP 头,然后在 send() 方法中规定所要发送的数据
Leophen
2019/08/23
9810
ASP.NET (Core)WebApi参数传递实操演练
一、ASP.NET (Core)WebApi参数传递实操演练 1、什么是contentType和dataType? $.ajax contentType 和 dataType , contentType 主要设置你发送给服务器的格式,dataType设置你收到服务器数据的格式。 更简单的解释: contentType: 告诉服务器,我要发什么类型的数据。 dataType:告诉服务器,我要想什么类型的数据。 在http 请求中,get 和 post 是最常用的。在 jquery 的 ajax 中, c
跟着阿笨一起玩NET
2021/02/02
3.8K0
java调用HTTP接口(Get请求和Post请求)
大家好,又见面了,我是你们的朋友全栈君。 前提: 一个Http接口:http://172.83.38.209:7001/NSRTRegistration/test/add.do?id=8888888&
全栈程序员站长
2022/08/31
4.1K0
java调用HTTP接口(Get请求和Post请求)
silverlight: http请求的GET及POST示例
http请求的get/post并不是难事,只是silverlight中一切皆是异步,所以代码看起来就显得有些冗长了,下面这个HttpHelper是在总结 园友 的基础上,修改得来: 1 namespace SLAwb.Helper 2 { 3 public sealed class MediaType 4 { 5 /// <summary> 6 /// "application/xml" 7 /// </summary> 8
菩提树下的杨过
2018/01/19
1.3K0
silverlight: http请求的GET及POST示例
HTTP_POST请求的数据格式
通过上面的例子,我们可以看到在Request Headers里面以后很多字段,比如Content-type,Host这些,那么这些字段又有什么意思呢,下面通过表格来介绍一下:
全栈程序员站长
2022/07/21
1.2K0
vue中axios处理http发送请求的示例(Post和get)
axios中文文档:https://github.com/mzabriskie/axios#using-applicationx-www-form-urlencoded-format
晓歌
2018/08/15
5.5K0
vue中axios处理http发送请求的示例(Post和get)
php socket 发送HTTP请求 POST json
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/112663.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/08
2.4K0
点击加载更多

相似问题

内容类型为application/x-www-form-urlencoded的Post请求在Spring中不起作用

294

Http Post请求,内容类型为application/x-www-form-urlencoded,在春季不起作用

68

如何发送内容类型为"application/x-www-form-urlencoded“的POST请求

10

Http请求,内容类型为application/x form-urlencoded,在Spring中不起作用

21

无法在post请求上创建内容类型为: application/x-www-form-urlencoded的模拟

17
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文