okhttppost表单请求参数为null过滤

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了okhttppost表单请求参数为null过滤相关的知识,希望对你有一定的参考价值。

(1)问题的现象

HttpURLConnection请求第三方接口,但返回值始终为空
(2)问题可能原因

第一,第三方接口有问题。不能正确处理请求。

第二,项目用的框架存在问题,请求对第三方接口或者第三方接口返回的内容被屏蔽了。

第三,项目本身代码的问题。

(3)排除方法

第一,首先排除接口的问题,因为通过chrome的一些插件如Advanced rest client调用第三方接口,能正常返回结果。

第二,排除了项目框架的问题。因为不用项目框架,单独写个main方法,将项目中的代码粘过来,进行调用还是得不到结果。

第三,项目本身代码的问题。前两者都不是,那么一定就是代码的原因了。但是开发环境无法连接第三方接口,只有客户的运行环境中才能连接。那如何定位呢?最后灵光一闪,还是直接访问一个web页面吧。于是将url修改了一下,进行了debug。发现HttpURLConnection请求有应答。奇了怪了。可是再细心一看,应答内容和web页面内容又有所不同,应答内容明显变少了。这样问题就很快能定位了,一定是解析请求结果出了问题。原来在循环中br.readLine被执行了多次。

while (bf.readLine() != null)
sb.append(bf.readLine());//错误写法,因为while中已经readLine了,之后游标跳到了下一行,此时读取的是下一行

//正确写法

while ((line = bf.readLine()) != null)
sb.append(line);


下面是HttpURLConnection请求的完整源码。

URL url = new URL(polycomUrl);
// 将url 以 open方法返回的urlConnection 连接强转为HttpURLConnection连接
// (标识一个url所引用的远程对象连接)
HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 此时cnnection只是为一个连接对象,待连接中
// 设置连接输出流为true,默认false (post 请求是以流的方式隐式的传递参数)
connection.setDoOutput(true);
// 设置连接输入流为true
connection.setDoInput(true);
// 设置请求方式为post
connection.setRequestMethod("POST");
// post请求缓存设为false
connection.setUseCaches(false);
connection.setConnectTimeout(20000);
connection.setReadTimeout(20000);
// 设置该HttpURLConnection实例是否自动执行重定向
connection.setInstanceFollowRedirects(true);
// 设置请求头里面的各个属性 (以下为设置内容的类型,设置为经过urlEncoded编码过的from参数)
// application/x-javascript text/xml->xml数据
// application/x-javascript->json对象
// application/x-www-form-urlencoded->表单数据
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
// 建立连接
// (请求未开始,直到connection.getInputStream()方法调用时才发起,以上各个参数设置需在此方法之前进行)
connection.connect();
// 创建输入输出流,用于往连接里面输出携带的参数,(输出内容为?后面的内容)
DataOutputStream dataout = new DataOutputStream(connection.getOutputStream());
String parm = URLEncoder.encode(requestXmlString, "utf-8"); // URLEncoder.encode()方法
// 为字符串进行编码
// 将参数输出到连接
dataout.writeBytes(parm);
// 输出完成后刷新并关闭流
dataout.flush();
// dataout.close(); // 重要且易忽略步骤 (关闭流,切记!)

// 连接发起请求,处理服务器响应 (从连接获取到输入流并包装为bufferedReader)
BufferedReader bf = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder sb = new StringBuilder(); // 用来存储响应数据

// 循环读取流,若不到结尾处
while ((line = bf.readLine()) != null)
//sb.append(bf.readLine());
sb.append(line);

// bf.close(); // 重要且易忽略步骤 (关闭流,切记!)
// connection.disconnect(); // 销毁连接
System.out.println("returnxmlnew====================" + sb.toString());
参考技术A OkHttp提供了一个FormBody.Builder类,可以用来构建表单请求参数。

FormBody.Builder formBodyBuilder = new FormBody.Builder();
formBodyBuilder.add("param1", "value1");
formBodyBuilder.add("param2", "value2");
// ...
Request request = new Request.Builder()
.url(url)
.post(formBodyBuilder.build())
.build();

react native 网络get请求方式参数不可为undefined或null

react native 网络get请求方式参数不可为undefined(为空的话默认变为)或null

错误写法:

export function addToCartAction(isRefreshing, loading, spId, number, spfId = null, pgId = null) {
    console.warn(‘==>‘,spId+":"+number);
    return  (isRefreshing || loading) ? 
        {types: [FETCH_ADD_TO_CART.code, SUCCESS_ADD_TO_CART, FAILURE_ADD_TO_CART],
            callAPI: () => request(FETCH_ADD_TO_CART.url+‘?spId=‘+spId+‘&number=‘+number+‘&spfId=‘+spfId+‘&pgId=‘+pgId),
            payload: {isRefreshing, loading}
        } : {type: CLEAR_ADD_TO_CART, isRefreshing, loading};
}

正确写法:

export function addToCartAction(isRefreshing, loading, spId, number) {
    console.warn(‘==>‘,spId+":"+number);
    return  (isRefreshing || loading) ? 
        {types: [FETCH_ADD_TO_CART.code, SUCCESS_ADD_TO_CART, FAILURE_ADD_TO_CART],
            callAPI: () => request(FETCH_ADD_TO_CART.url+‘?spId=‘+spId+‘&number=‘+number),
            payload: {isRefreshing, loading}
        } : {type: CLEAR_ADD_TO_CART, isRefreshing, loading};
}

 

以上是关于okhttppost表单请求参数为null过滤的主要内容,如果未能解决你的问题,请参考以下文章

从 servlet 读取 POST 请求参数

form中action属性后面传递参数怎么获取不到?

JavaWeb 过滤敏感词汇

OkHttp POST 请求设置 withCredentials 为 True?

Feign调用,get请求,参数为对象, 解决请求对象以及参数值为null

【求助】关于JQuery获取不到值,请求参数为Null