表单向服务器发送http请求通常有哪两种办法

表单向服务器发送http请求通常有哪两种办法,第1张

表单向服务器发送http请求通常有这Get和Post两种办法。将表单数据发送给服务器的常用方式有两种:Get和Post。浏览器发送给服务器的HTTP请求分为:请求头(header)和请求主体(body)两部分。其中,必须包含头部分,用于指定发送请求的方式、目的地以及其他关键信息;而主体是可选的。在头数据和主体数据之间用一个空白行来隔开。

Get和Post区别

GET和POST的主要区别是数据以何种方式发送到服务器。GET将表单域名和值作为键/值对追加到URL末尾。URL中。后面的数据是可见的。POST也会发送数据,同样通过一个关联数据发送,但是编码方式不同,另外URL中的数据对最终用户不可见。

Web前端开发中,以post方式向服务器发送请求的操作再平常不过。发送post请求时,若需要传递数据,数据是包含在消息主体中的。

传递数据的方式有两种:表单和json。使用表单时,数据类型是普通的文本数据,或文件(大型二进制数据或者包含非ASCII字符的数据)。而json是指序列化后的 JSON 字符串。

对于表单方式,消息主体的编码方式有三种:

x-www-form-urlencoded 这种方式只能传输普通文本数据,后来为了提供文件上传的功能,提出了 form-data 方式,可以实现文本数据和文件混合传输,所谓 multipart 。

对于json而言,消息主体的编码方式是: application/json

消息主体的编码方式通过 Content-Type 字段标明。有时候前端传递具体的 Content-Type 可能会导致请求失败,因为有可能后端设计接口的时候,预先设定了传递的数据类型,它也会使用对应的解码方式。如果前端对此不知情,使用了错误的编码格式,反而会导致请求失败。这个时候去掉 Content-Type 设置,问题可能就解决了。

参考资料:

客户端向服务器发送数据时,份两种情况,SSL单向验证和SSL双向验证

1.SSL单向验证时

代码如下:

Java代码

import java.io.IOException

import java.util.HashMap

import java.util.Map

import org.apache.commons.httpclient.HttpClient

import org.apache.commons.httpclient.HttpException

import org.apache.commons.httpclient.HttpStatus

import org.apache.commons.httpclient.NameValuePair

import org.apache.commons.httpclient.methods.PostMethod

import org.apache.commons.httpclient.params.HttpClientParams

import org.apache.commons.httpclient.params.HttpMethodParams

import org.apache.commons.logging.Log

import org.apache.commons.logging.LogFactory

public class ClientSendData {

static Log log = LogFactory.getLog(ClientSendData.class)

private String Url

// 初始化数据

public ClientSendData() {

Url = "https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action"

}

public String sendData(String data) {

String receivedData = null

try {

Map<String, String>paramsData = new HashMap<String, String>()

paramsData.put("data", data)

receivedData = send(Url, paramsData)

} catch (Exception e) {

e.printStackTrace()

}

return receivedData

}

public static String send(String url, Map<String, String>paramsMap) {

String result = null

PostMethod postMethod = null

HttpClient httpClient = new HttpClient()

httpClient.getParams().setParameter(

HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8")

postMethod = new PostMethod(url)

if (paramsMap != null &&paramsMap.size() >0) {

NameValuePair[] datas = new NameValuePair[paramsMap.size()]

int index = 0

for (String key : paramsMap.keySet()) {

datas[index++] = new NameValuePair(key, paramsMap.get(key))

}

postMethod.setRequestBody(datas)

}

HttpClientParams httparams = new HttpClientParams()

httparams.setSoTimeout(60000)

postMethod.setParams(httparams)

try {

int statusCode = httpClient.executeMethod(postMethod)

if (statusCode == HttpStatus.SC_OK) {

result = postMethod.getResponseBodyAsString()

log.info("发送成功!")

} else {

log.error(" http response status is " + statusCode)

}

} catch (HttpException e) {

log.error("error url=" + url, e)

} catch (IOException e) {

log.error("error url=" + url, e)

} finally {

if (postMethod != null) {

postMethod.releaseConnection()

}

}

return result

}

public static void main(String[] args) {

ClientSendData t = new ClientSendData()

t.sendData("测试SSL单项连接,向服务端发送数据!")

}

}

可能出现的异常

1.java.net.ConnectException: Connection refused: connect

服务器没有启动

2 .javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed

服务端的证书是不可信的。解决办法见这篇文章 http://zhuyuehua.iteye.com/blog/1102347

3.java.net.SocketException: Software caused connection abort: recv failed

这是由于服务端配置的是SSL双向认证,而客户端发送数据是按照服务器是单向认证时发送的,即没有将客户端证书信息一起发送给服务端。

4.org.apache.commons.httpclient.NoHttpResponseException

这一般是服务端防火墙的原因。拦截了客户端请求。

另外,当服务端负载过重时,也会出现此问题。

5.javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

这是由于服务端配置的是SSL双向认证,而客户端发送数据是按照服务器是单向认证时发送的,即没有将客户端证书信息一起发送给服务端。服务端验证客户端证书时,发现客户端没有证书,然后就断开了握手连接。

2.SSL双向验证时

双向验证时,暂时不知道如何用HTTPCLIENT发送数据,如需要双向验证时发送数据,参考我另外的文章。另外,有知道HTTPCLIENT如何在双向验证时发送数据的,恳请指教。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/189438.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-30
下一篇2023-03-30

发表评论

登录后才能评论

评论列表(0条)

    保存