gpt4 book ai didi

java - Android 中的安全 HTTP Post

转载 作者:IT老高 更新时间:2023-10-28 20:48:24 28 4
gpt4 key购买 nike

我有一个非常基本的帮助程序类,我用它来完成我所有的 Http Get/Post 工作。我正在使用 org.apache.http 库中的 HttpGet、HttpPost 和 HttpClient。我所有的东西都可以通过 HTTP 正常工作,但是一旦我尝试使用通过 HTTPS 工作的服务,在执行请求时就会收到 ClientProtocolException。异常中的唯一消息是“服务器未能以有效的 HTTP 响应进行响应”。

为了进行测试,我使用简单的 html 表单从浏览器发送了完全相同的有效负载,并使用 RequestBuilder 发送了 Fiddler2。我已经发送了无效的和空的有效载荷,甚至发送了带有和不带有 header 的所有上述内容,以查看对象构建请求的方式是否有问题。

我在测试中使用的所有东西都会给我一个有效的 200 状态 HTTP 响应。如果我给它提供的东西不是它所期望的,该服务只会给我一个描述错误的结构。

我需要向 HttpPost 或 HttpClient 对象添加什么特别的东西来告诉它使用 HTTPS 吗?我必须明确告诉它使用不同的端口吗?

编辑:

我确实为 https 通信注册了错误的套接字工厂。这是我用来创建具有正确套接字工厂的 HttpClient 对象的更新方法,以防将来有人搜索此类问题:

private HttpClient createHttpClient()
{
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);

SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);

return new DefaultHttpClient(conMgr, params);
}

最佳答案

我不确定您为什么不能处理 HTTPS。我为自己的应用程序编写了一个帮助程序类,并且能够毫无问题地 GET/POST 到 HTTPS。我会把代码贴在这里,也许你可以看看我的代码和你的代码之间是否存在差异。

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.client.params.CookiePolicy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

import android.util.Log;

public class HttpRequest{

DefaultHttpClient httpClient;
HttpContext localContext;
private String ret;

HttpResponse response = null;
HttpPost httpPost = null;
HttpGet httpGet = null;

public HttpRequest(){
HttpParams myParams = new BasicHttpParams();

HttpConnectionParams.setConnectionTimeout(myParams, 10000);
HttpConnectionParams.setSoTimeout(myParams, 10000);
httpClient = new DefaultHttpClient(myParams);
localContext = new BasicHttpContext();
}

public void clearCookies() {
httpClient.getCookieStore().clear();
}

public void abort() {
try {
if (httpClient != null) {
System.out.println("Abort.");
httpPost.abort();
}
} catch (Exception e) {
System.out.println("Your App Name Here" + e);
}
}

public String sendPost(String url, String data) {
return sendPost(url, data, null);
}

public String sendJSONPost(String url, JSONObject data) {
return sendPost(url, data.toString(), "application/json");
}

public String sendPost(String url, String data, String contentType) {
ret = null;

httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109);

httpPost = new HttpPost(url);
response = null;

StringEntity tmp = null;

Log.d("Your App Name Here", "Setting httpPost headers");

httpPost.setHeader("User-Agent", "SET YOUR USER AGENT STRING HERE");
httpPost.setHeader("Accept", "text/html,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");

if (contentType != null) {
httpPost.setHeader("Content-Type", contentType);
} else {
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
}

try {
tmp = new StringEntity(data,"UTF-8");
} catch (UnsupportedEncodingException e) {
Log.e("Your App Name Here", "HttpUtils : UnsupportedEncodingException : "+e);
}

httpPost.setEntity(tmp);

Log.d("Your App Name Here", url + "?" + data);

try {
response = httpClient.execute(httpPost,localContext);

if (response != null) {
ret = EntityUtils.toString(response.getEntity());
}
} catch (Exception e) {
Log.e("Your App Name Here", "HttpUtils: " + e);
}

Log.d("Your App Name Here", "Returning value:" + ret);

return ret;
}

public String sendGet(String url) {
httpGet = new HttpGet(url);

try {
response = httpClient.execute(httpGet);
} catch (Exception e) {
Log.e("Your App Name Here", e.getMessage());
}

//int status = response.getStatusLine().getStatusCode();

// we assume that the response body contains the error message
try {
ret = EntityUtils.toString(response.getEntity());
} catch (IOException e) {
Log.e("Your App Name Here", e.getMessage());
}

return ret;
}

public InputStream getHttpStream(String urlString) throws IOException {
InputStream in = null;
int response = -1;

URL url = new URL(urlString);
URLConnection conn = url.openConnection();

if (!(conn instanceof HttpURLConnection))
throw new IOException("Not an HTTP connection");

try{
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.connect();

response = httpConn.getResponseCode();

if (response == HttpURLConnection.HTTP_OK) {
in = httpConn.getInputStream();
}
} catch (Exception e) {
throw new IOException("Error connecting");
} // end try-catch

return in;
}
}

关于java - Android 中的安全 HTTP Post,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2253061/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com