JAVA http请求与 C#Http请求

BXS_null 2018-10-10 04:16:58
这是别人给的JAVAdemo
public static int connectionTimeOut = 20000;
public static int readTimeOut = 60000;





public static String post(String url,NameValuePair[] data) throws Exception{
return post(url, data, null) ;
}

public static String post(String url,NameValuePair[] data,Header[] headers) throws Exception{
if(StringUtils.isEmpty(url)){
throw new Exception("The url is empty!") ;
}
HttpClient httpClient = getHttpClient(true) ;
HttpPost httpPost = new HttpPost(new URI(url.trim())) ;
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>() ;
for(NameValuePair d : data){
nameValuePairs.add(d) ;
}
try{
if(null != headers && 0 != headers.length){
httpPost.setHeaders(headers) ;
}
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8)) ;
HttpResponse httpResponse = httpClient.execute(httpPost) ;
int respCode = httpResponse.getStatusLine().getStatusCode() ;
String respData = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
if(respCode != HttpStatus.SC_OK){
throw new Exception("Bad response status, " + respCode + "," + respData) ;
}
return respData ;
}finally{
httpClient.getConnectionManager().shutdown();
}
}





private static HttpClient getHttpClient(boolean useSSL){
HttpClient httpClient = useSSL ? getHttpsClient() : new DefaultHttpClient() ;
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeOut);
httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, readTimeOut);
return httpClient;
}

private static HttpClient getHttpsClient(){
HttpClient httpClient = new DefaultHttpClient() ;
SSLContext sslContext = null ;
try {
sslContext = SSLContext.getInstance("SSL") ;
sslContext.init(null, new TrustManager[]{trustManager}, null) ;
SSLSocketFactory sslSocketFactory = new SSLSocketFactory(sslContext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
ClientConnectionManager clientConnectionManager = httpClient.getConnectionManager();
SchemeRegistry schemeRegistry = clientConnectionManager.getSchemeRegistry();
schemeRegistry.register(new Scheme("https", 443, sslSocketFactory));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return httpClient ;
}


private static X509TrustManager trustManager = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};


这是我自己的C#http请求
  

ReadHTTPForPostUrl(queryUrl, data, "application/x-www-form-urlencoded",null);

private string ReadHTTPForPostUrl(string queryUrl, string data, string contentType, string[] hreaders)
{
if (!string.IsNullOrEmpty(queryUrl) && queryUrl.StartsWith("http//") ) queryUrl = queryUrl.Replace("http//","http://");
HttpWebRequest request = WebRequest.Create(queryUrl) as HttpWebRequest;
if (hreaders != null && hreaders.Length > 0)
{
request.Headers.Clear();
foreach (string h in hreaders)
{

string[] name_value = h.Split(":".ToCharArray());
if (name_value != null && name_value.Length == 2)
{
try
{
if ("accept".Equals(name_value[0].ToLower()))
{
request.Accept = name_value[1].Trim();
}
else if ("content-type".Equals(name_value[0].ToLower()))
{
request.ContentType = name_value[1].Trim();
}
else
{
request.Headers.Add(name_value[0], name_value[1].Trim());
}
}
catch (Exception ex)
{
Log.Info("name=" + name_value[0] + ";value=" + name_value[1].Trim());
Log.Error(ex.Message, ex);
}
}

}
}

if (data != null && data.Length > 0)
{
byte[] post_bytes = System.Text.Encoding.UTF8.GetBytes(data);

request.Method = "POST";
request.ContentType = contentType;


request.ContentLength = post_bytes.Length;
System.IO.Stream outStream = request.GetRequestStream();
outStream.Write(post_bytes, 0, post_bytes.Length);
outStream.Close();
}

HttpWebResponse response = request.GetResponse() as HttpWebResponse;

StreamReader sr = new StreamReader(response.GetResponseStream());
string _content = sr.ReadToEnd();

try
{
sr.Close();
if (request != null)
{
request.Abort();
request=null;
}
if (response != null)
{
response.Close();
response=null;
}


}
catch { }

return _content;
}


我自己的请求总是请求失败,这两个请求是不是哪里不一样,比如说ContentType格式之类的。救救我吧,实在是找不到哪里有问题,java不是很懂

...全文
1118 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你c#里面调试一下把值都打印出来 跟 JAVA的值是不是一致做下对比吧
aj1314_kk 2018-10-12
  • 打赏
  • 举报
回复
不错不错不错
weixin_43395444 2018-10-12
  • 打赏
  • 举报
回复
就是用UTF8编码,对要提供的POST参数对
BXS_null 2018-10-11
  • 打赏
  • 举报
回复
我刚刚用postman试了下,请求之后给我返回成功,但是http请求就是失败,说加密的参数不对,现在就是 那个加密的编码被改变了,在这个改变是在哪里改的
BXS_null 2018-10-11
  • 打赏
  • 举报
回复
就是这个参数 这两个不一样 正确的应该是下面这个
BXS_null 2018-10-11
  • 打赏
  • 举报
回复
我抓包了发现一个问题!! 有个参数需要加密,抓包之后在TextView 里面是 Nl9m%252FYP7%252BHZWRLQva6MSHAvpVaQ%253D 这个在java验证过了是一致的,但是我看Webforms里面 这个参数的值是 Nl9m%2FYP7%2BHZWRLQva6MSHAvpVaQ%3D 两个不一样 这是哪里的问题,会不会就是这里出问题了,
游北亮 2018-10-11
  • 打赏
  • 举报
回复
引用 9 楼 weixin_40068689 的回复:
我想问一下这一句代码是做什么用的 httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8)) ; 这句代码是就是以HTTP.UTF_8方式传输吗 有没有进行什么转义
很明显,就是用UTF8编码,对要提供的POST参数对,进行编码,以后给httpClient提交数据使用, 类似于.net的: byte[] post_bytes = System.Text.Encoding.UTF8.GetBytes(data);
BXS_null 2018-10-10
  • 打赏
  • 举报
回复
我想问一下这一句代码是做什么用的 httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8)) ; 这句代码是就是以HTTP.UTF_8方式传输吗 有没有进行什么转义
BXS_null 2018-10-10
  • 打赏
  • 举报
回复
引用 6 楼 duanzi_peng 的回复:
ueryUrl.StartsWith("http//") ->http:// 什么鬼 没有中间的分号
额 这不是检错吗
BXS_null 2018-10-10
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
没看到实际的 url ,不大好说 现时的网站大多使用 https 而不是 http 协议了,你的 C# 代码中没有关于证书的部分,而你给的 Java 代码中是有的
好像不是这个地方的问题,我能成功访问到接口,只是说我的参数的值不对
exception92 2018-10-10
  • 打赏
  • 举报
回复
ueryUrl.StartsWith("http//")
->http:// 什么鬼 没有中间的分号
游北亮 2018-10-10
  • 打赏
  • 举报
回复
代码太长,没认真看, 最简单的,在代码里设置使用Fiddler作为代理, 抓包对比2个请求的Header和Body,看看有什么差异
xuzuning 2018-10-10
  • 打赏
  • 举报
回复
没看到实际的 url ,不大好说
现时的网站大多使用 https 而不是 http 协议了,你的 C# 代码中没有关于证书的部分,而你给的 Java 代码中是有的
BXS_null 2018-10-10
  • 打赏
  • 举报
回复
贴一下前面数据代码 JAVA demo
try {
			TreeMap<String,String> treeMap = new TreeMap<String,String>() ;
			 treeMap.put("app_key", sp_app_key);
			 treeMap.put("phone", phone);
			 treeMap.put("billing_no", billing_no);
			 treeMap.put("timestamp", timestamp);
			 String sign = open189.sign.ParamsSign.value(treeMap,sp_app_secret);
			 //注意这个地方
			 sign=URLEncoder.encode(sign,"UTF-8");
			 NameValuePair[] params = {
					new BasicNameValuePair("app_key",treeMap.get("app_key")),
					new BasicNameValuePair("phone",treeMap.get("phone")),
					new BasicNameValuePair("billing_no",treeMap.get("billing_no")),
					new BasicNameValuePair("state",state),
					new BasicNameValuePair("reback_url",reback_url),
					new BasicNameValuePair("sign",sign),
					new BasicNameValuePair("timestamp",treeMap.get("timestamp"))};
			String resp = HttpClientCommon.post(url, params) ;
C#是拼接成 a=xx&b=yy这种格式的
BXS_null 2018-10-10
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
你的data是拼接成的 a=xx&b=yy这种格式吗?
是 是这种格式
  • 打赏
  • 举报
回复
你的data是拼接成的 a=xx&b=yy这种格式吗?

110,477

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧