之前写过接口接收json格式的post请求,当时自己写完以为可以适应各种报文的发送,最近对方说要有个”content=发送内容”,这不就是最简单的post请求吗,那直接用我之前写的发送方法加上“content=“不就可以了,结果对方说没有content,后来网上找的很多方法都可以成功,为什么我之前写的不行,之后改了行代码就可以了。先说明改了哪行代码,再探究一下为什么。

/**
     * 向指定URL发送post方法的请求,字符串
     * @param urlString 地址
     * @param reqString 请求参数 name1=value1&name2=value2 的形式。
     * @return String 返回内容
     */
public static String postString(String urlString ,String reqString) {
            StringBuffer sb = new StringBuffer("");
            try {
                // 创建连接
                URL url = new URL(urlString);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("POST");
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setUseCaches(false);
                connection.setInstanceFollowRedirects(true);
                //下边这行注释掉           
                /***connection.setRequestProperty("Content-Type","application/json;charset=UTF-8");**
*/              connection.connect();
                DataOutputStream out = new DataOutputStream(
                        connection.getOutputStream());
                out.write(reqString.getBytes("UTF-8"));
                out.flush();
                out.close();
                // 读取响应
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        connection.getInputStream(),"utf-8"));
                String lines;

                while ((lines = reader.readLine()) != null) {
                    sb.append(lines);
                }
                reader.close();
                // 断开连接
                connection.disconnect();
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (sb.toString().length()==0|sb.toString().trim().length()==0) {
                return "";
            }
            return sb.toString();
        }

只改变了一行代码,就相当于两种传输格式了。下面分析一下Content-Type不同的影响
application/json
application/json 用来告诉服务端消息主体是序列化后的 JSON 字符串。
JSON 格式支持比键值对复杂得多的结构化数据,但是如果在这种格式下用到key—value形式,接收方就接收不到value,因为本人小白,其实不懂这之间的本质,只能多测试几次,首先传输json格式的报文,传输之后解析成功,传输非json格式的报文的话,其实也可以接收到报文的整体内容,那么可能不是application/json 的影响,看下边这种格式,

application/x-www-form-urlencoded

常见的 POST 提交数据的方式。浏览器的原生 form 表单,如果不设置 enctype 属性,以及 ajax 提交数据那么最终就会以 application/x-www-form-urlencoded 方式提交数据。我们只看数据通过post请求接口提交数据,按照key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。例:

post接口可以用python代码调用吗_post


第一部分 请求行,请求方法 post

第二部分 请求头部 Content-Type: application/x-www-form-urlencoded

Content-Length: 38

一个空行

第三部分 请求的数据 经过URLEncoder.encode的数据

区别就应该在第三部分的处理形式,application/json形式的传输没有第三部分的处理