在Java中,如果我想在服务器上发送数据到表单,其中表单类型是:
<form method="post" ID="form1" name="form1" action=""> <div ID="login" > <div >Log in</div> <div > <label for="txtUser">User:</label> <input ID="txtUser" name="txtUser" type="text" size="13" value="" /> <label for="txtPassword">Password:</label> <input ID="txtPassword" name="txtPassword" type="password" size="13" value="" /> <input ID="BLogin" name="BLogin" type="submit" value="Log in" /> </div> <div > <input type="checkBox" ID="chkSave" name="chkSave" /> <label for="chkSave">Save account</label> </div> </div> </form>
在这种情况下,我必须使用httpPost方法,因为表单接受方法“post”,因为它在表单定义(初始化)中声明:
<form method="**post**" ID="form1" name="form1" action="">
在我的例子(AndroID解决方案)我正在使用
__VIEWSTATE__EVENTTARGET__EVENTARGUMENTctl00$tbUsernamectl00$tbPwdctl00$chkRememberLoginctl00$cmdLogin
值,因为它们是服务器发布帖子所需的一次.在没有编程服务器的情况下,我在哪里可以找到服务器所需的内容?我使用WireShark软件查看客户端和服务器之间的所有响应或传出请求,只需使用http过滤器来查看http事务.然后使用任何浏览器以通常的方式在线登录,然后在WireShark中,您将看到浏览器和服务器之间的所有请求和响应.通过已知的IP地址或主机地址找到您感兴趣的那个,然后复制您在任何事务上单击右键时找到的可读字节.因此,当您这样做时,您将发现您对服务器的请求必须如何以及需要哪些值.
回到编码(java):
public httpResponse httpPost1(String vIEwstateValue, String url, String username, String password) throws ConnectTimeoutException { try { // --------post httpPost httppost = new httpPost(url); List<nameValuePair> nameValuePairs = new ArrayList<nameValuePair>(); nameValuePairs.add(new BasicnameValuePair("__VIEWSTATE", vIEwstateValue)); nameValuePairs.add(new BasicnameValuePair("__EVENTTARGET", "")); nameValuePairs .add(new BasicnameValuePair("__EVENTARGUMENT", "")); nameValuePairs.add(new BasicnameValuePair("ctl00$tbUsername", username)); nameValuePairs.add(new BasicnameValuePair("ctl00$tbPwd", password)); nameValuePairs.add(new BasicnameValuePair( "ctl00$chkRememberLogin", "0")); nameValuePairs.add(new BasicnameValuePair("ctl00$cmdLogin", "Login")); // nameValuePairs.add(new // BasicnameValuePair("ctl00$cmdForgetMe", // "Forget Me")); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); response = clIEnt.execute(httppost); String responseHTML = EntityUtils.toString(response .getEntity()); // System.out.println(responseHTML); // System.out.println(response1.getStatusline()); } catch (ClIEntProtocolException e) { } catch (IOException e) { } return response; }
在这里,我将值发布到我事先知道的URL.
您可以使用添加标头
httppost.addheader("Referer", "http://website/login.asp");
或请求的超时值
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); int timeoutConnection = 5000; httpParams httpParameters = new BasichttpParams(); httpconnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
在这种情况下,最好在发生超时时捕获异常并再次发出请求,因为建议在httpClIEnt文档中进行.
默认情况下,httpClIEnt遵循重定向,但每次重定向都可以通过以下方式捕获:
private RedirectHandler customredirectHandler;........(maybe constructor..) clIEnt.setRedirectHandler(customredirectHandler);........class CustomredirectHandler extends DefaultRedirectHandler { @OverrIDe public boolean isRedirectRequested(httpResponse response, httpContext context) { // System.out.println("isRedirectRequested"); return true; } @OverrIDe public URI getLocationURI(httpResponse response, httpContext context) throws ProtocolException { String location = response.getLastheader("Location").getValue(); if (location.contains("Login")) { // System.out.println("Login needed"); } else { // System.out.println("No login required"); } URI redirectURI = null; try { redirectURI = new URI(location); } catch (URISyntaxException e) { } return redirectURI; } }}
然后在完成客户端所需的一切后,您可能会释放客户端连接:
public voID shutDownClIEnt() { clIEnt.getConnectionManager().shutdown();}
这是httpClIEnt的一个例子,不要忘记你也可能使用UrlConnection,这里有差异显示:
http://www.innovation.ch/java/HTTPClient/urlcon_vs_httpclient.html
所以这取决于您喜欢使用什么以及哪种更适合您的项目.
附:此POST解决方案应用于我的项目,但它可能不适用于您的..首先使用Wireshark,然后查看必须将哪种请求发送到服务器.在我的情况下,它就像vIEwstate = sdsgdgdfd323& username = dsfngkjfdg& password = dsfsdfsfs …..但我知道可能还有其他人.
解决方法:
URL是否接受PUT代替POST完全取决于服务器.
大多数期望POST的服务器都只接受POST.很少使用PUT.
总结以上是内存溢出为你收集整理的Java httpPost成.asp形式全部内容,希望文章能够帮你解决Java httpPost成.asp形式所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)