更新: 自己找到答案,见下文:-)
嗨,
我目前正在编写一个Android应用程序,它使用HTTP Post和AsyncTask在后台提交内容.为此我使用org.apache.http.client包.我的代码基于这个例子.
基本上,我的代码看起来像这样:
public void postData() {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://192.168.1.137:8880/form");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("id", "12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
Log.e(TAG,e.toString());
} catch (IOException e) {
Log.e(TAG,e.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
问题是httpclient.execute(..)行需要大约1.5到3秒,我不明白为什么.仅使用HTTP Get请求页面大约需要80 ms左右,因此问题似乎不是网络延迟本身.
问题似乎也不在服务器端,我也尝试将数据发布到http://www.disney.com/同样慢的结果.Firebug在本地向我的服务器发送数据时显示1 …
我试图登录到网站,并保持该会话/ cookie的,这样服务器会识别出我的登录信息,但我在努力搞清楚提取响应中的cookie,并设置为保持我的登录请求的方式.我想知道我是否应该采用标题"Set-Cookie"或使用CookieStore.任何帮助是极大的赞赏.这是我的代码,其中包含我认为getHeader/getCookie方法的注释.
public class Http
{
DefaultHttpClient client = new DefaultHttpClient();
HttpGet request;
HttpEntity entity;
HttpResponse response;
HttpPost post;
CookieStore cookieStore = new BasicCookieStore();
HttpContext localContext = new BasicHttpContext();
public static void setContext()
{
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
}
public static void getPage(String url) throws Exception
{
request = new HttpGet(url);
response = client.execute(request, localContext);
PARSER.preParse(url, response);
}
public static HttpResponse postPage(List<NameValuePair> params, String host, String action) throws Exception
{
post = new HttpPost(host + action);
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
response = client.execute(post, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用HttpDelete对象来调用Web服务的delete方法.Web服务的代码从消息的正文中解析JSON.但是,我无法理解如何向HttpDelete对象添加主体.有没有办法做到这一点?
使用HttpPut和HttpPost,我调用setEntity方法并传入我的JSON.HttpDelete似乎没有任何此类方法.
如果无法为HttpDelete对象设置主体,请将我链接到使用超类HttpDelete的资源,以便我可以设置方法(删除)并设置主体.我知道这不太理想,但此时我无法改变网络服务.
我正在尝试在java中为我正在处理的Android应用发布一些JSON数据.以下是有效的还是我需要以不同的方式推送JSON字符串?
HttpPost httpost = new HttpPost("http://test.localhost");
httpost.setEntity(new StringEntity("{\"filters\":true}"));
httpost.setHeader("Accept", "application/json");
httpost.setHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
//... other java code to execute the apache httpclient
Run Code Online (Sandbox Code Playgroud)
先感谢您
我在xamarin表单项目中使用HttpClient
该类已记录,但我找不到任何有关其方法可能引发异常的文档.
例如,GetAsync方法没有关于可能的异常的任何文档.但我认为它会抛出,例如当服务器无法访问时.
这个类可能会抛出一些例外列表吗?
我正在将一些数据发布到正在回答302 Moved Temporarily的服务器上.
我希望HttpClient遵循重定向并自动获取新位置,因为我认为这是HttpClient的默认行为.但是,我得到一个例外,而不是遵循重定向:(
这是相关的代码片段,任何想法都将受到赞赏:
HttpParams httpParams = new BasicHttpParams();
HttpClientParams.setRedirecting(httpParams, true);
SchemeRegistry schemeRegistry = registerFactories();
ClientConnectionManager clientConnectionManager = new ThreadSafeClientConnManager(httpParams, schemeRegistry);
HttpClient httpClient = new DefaultHttpClient(clientConnectionManager, httpParams)
HttpPost postRequest = new HttpPost(url);
postRequest.setHeader(HTTP.CONTENT_TYPE, contentType);
postRequest.setHeader(ACCEPT, contentType);
if (requestBodyString != null) {
postRequest.setEntity(new StringEntity(requestBodyString));
}
return httpClient.execute(postRequest, responseHandler);
Run Code Online (Sandbox Code Playgroud) 我正在使用HttpClient向我无法访问的web api服务之一发送请求,我需要跟踪从我的客户端到服务器的实际请求流.有没有办法可以连接小提琴手听取请求?
我使用System.Net.Http.HttpClient类发送请求.
更新:现在试图改善这个问题,因为我无法得到我想要的东西.我正在使用.Net客户端应用程序连接到我自己的IIS上通过HTTP通道托管的Web服务.我之前使用在我的IIS上托管的网站进行了小提琴调试,并观察了我的浏览器和WebSite之间产生的流量.但是,当看到.Net客户端程序使用HttpClient类与Web服务进行通信时产生的流量时,奇怪的是,小提琴手似乎无法利用该流量并且不会显示任何内容..Net HttpClient是否绕过WinInet API连接到服务,导致小提琴手无法观看流量?
我正在使用HttpClient 4.1.1来测试我的服务器的REST API.
我可以设法登录似乎工作正常,但当我尝试做任何其他事情我失败了.
我很可能在下一个请求中设置cookie时遇到问题.
这是我目前的代码:
HttpGet httpGet = new HttpGet(<my server login URL>);
httpResponse = httpClient.execute(httpGet)
sessionID = httpResponse.getFirstHeader("Set-Cookie").getValue();
httpGet.addHeader("Cookie", sessionID);
httpClient.execute(httpGet);
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来管理HttpClient包中的会话/ cookie设置?
我正在尝试使用以下代码向我的服务器发送请求.总是在第3次请求时失败了.
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
public class HttpClientTest {
private HttpClient client;
public HttpClientTest() {
HttpParams params = new BasicHttpParams();
params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 15000);
params.setParameter(CoreConnectionPNames.SO_TIMEOUT, 15000);
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "utf-8");
HttpProtocolParams.setUseExpectContinue(params, true);
ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager();
cm.setMaxTotal(100);
client = new DefaultHttpClient(cm, params);
while (true) { …Run Code Online (Sandbox Code Playgroud) 使用HttpClient时,尝试通过HTTPS进行通信时收到以下错误:
线程"main"中的异常javax.net.ssl.SSLPeerUnverifiedException:peer未经过身份验证.
这是我的代码:
URI loginUri = new URI("https://myUrl.asp");
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet( loginUri );
HttpResponse response = httpclient.execute( httpget );
Run Code Online (Sandbox Code Playgroud)
如何抑制或删除此错误?