【问题标题】:JAVA: http post requestJAVA:http 发布请求
【发布时间】:2012-10-11 14:52:29
【问题描述】:

我必须向网络服务发送请求以使用用户名和密码对用户进行身份验证。

我对以下发布请求有疑问:

public String postTest(String action, ConnectionParametrData [] parameters) {
        Uri.Builder builder = new Uri.Builder().scheme(scheme).authority(authority).path(action);
        uri = builder.build();
        BufferedReader in = null;
        String ans = null;
        HttpPost request = new HttpPost(uri.toString());
        HttpClient defaultClient = new DefaultHttpClient();
        try {
            request.setHeader("Content-Type", "application/x-www-form-urlencoded");
            request.setEntity(new UrlEncodedFormEntity(getValuePairs(parameters)));
            HttpResponse response = defaultClient.execute(request);
            in = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"), 8192);
            StringBuffer sb = new StringBuffer("");
            String line = "";
            String newLine = System.getProperty("line.separator");
            while((line = in.readLine()) != null) {
                sb.append(line + newLine);
            }
            ans = sb.toString();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
        return ans;
    }

当我执行此方法时,服务器会抛出错误,告知请求不是发布请求。

但是这种方法效果很好:

private String makePost(String action, ConnectionParametrData [] parameters) throws IOException {
        StringBuilder urlBuild = new StringBuilder();
        urlBuild.append(scheme).append("://www.").append(authority).append(action);
        URL url = new URL(urlBuild.toString());
        URLConnection urlConnection = url.openConnection();
        urlConnection.setDoInput(true);
        urlConnection.setDoOutput(true);
        urlConnection.setUseCaches(false);
        urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

        DataOutputStream printout = new DataOutputStream(urlConnection.getOutputStream());

        String content = getParameters(parameters);
        printout.writeBytes(content);
        printout.flush();
        printout.close();

        BufferedReader in = null;
        in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()), 8192);
        StringBuffer sb = new StringBuffer("");
        String line = "";
        String newLine = System.getProperty("line.separator");
        while((line = in.readLine()) != null) {
            sb.append(line + newLine);
        }
        in.close();
        return sb.toString();
    }

我更喜欢使用 HttpClient 而不是 URLConecction, 有人知道为什么第一种方法不被批准为 POST 吗?

【问题讨论】:

  • “抛出错误” - 以异常的形式?你检查过线路上的实际情况吗(WireShark)?
  • @wilek 你能打印 URI.toString() 并发布吗?

标签: java http-post httpclient


【解决方案1】:

在您的第一个代码 sn-p 中,我没有看到您在哪里设置登录和密码的任何帖子参数。

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair> {
        new BasicNameValuePair("login", "myusername"),
        new BasicNameValuePair("password", "somepassword")};
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

你可能想看看这个:http://www.androidsnippets.com/executing-a-http-post-request-with-httpclient

【讨论】:

    【解决方案2】:

    @詹姆斯布莱克

    设置参数我有一个方法:

    private List<NameValuePair> getValuePairs(ConnectionParametrData [] parameters) {
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            if(parameters != null) {
                for (ConnectionParametrData parameter : parameters) {
                    nameValuePairs.add(new BasicNameValuePair(parameter.getKey(), parameter.getValues()));
                }
            }
            return nameValuePairs;
        }
    

    @Fildor 服务器抛出异常。

    【讨论】:

      【解决方案3】:
      public String getPostPage(String postUrl, NameValuePair[] data,
              String cookie)
      {
          String html = "";
          PostMethod method = null;
          String contentStr = null;
          try
          {
              method = new PostMethod(postUrl);
              method.addRequestHeader("User-Agent", USER_AGENT);
              method.addRequestHeader("Host", "asqx.moni.gucheng.com");
              method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
              method.addRequestHeader("Referer", "...");
              method.getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES);
              method.addRequestHeader("Cookie", cookie);
              method.addRequestHeader("X-MicrosoftAjax", "Delta=true");
              method.addRequestHeader("Pragma", "no-cache");
      //            method.addRequestHeader("Accept-Encoding", "gzip, deflate");
              method.addRequestHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");
              method.addRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
              method.addRequestHeader("Accept-Language", "zh-cn,zh;q=0.5");
              method.setRequestBody(data);
              int statusCode = client.executeMethod(method);
      
              if(statusCode == HttpStatus.SC_OK)
              {
                  InputStream in = method.getResponseBodyAsStream();
                  if (in != null) {
                      byte[] tmp = new byte[4096];
                      int bytesRead = 0;
                      ByteArrayOutputStream buffer = new ByteArrayOutputStream(1024);
                      while ((bytesRead = in.read(tmp)) != -1) {
                          buffer.write(tmp, 0, bytesRead);
                      }
                      byte[] bt = buffer.toByteArray();
                      String gbk = new String(bt, "GBK");
                      String utf8 = new String(bt, "UTF-8");
                      if (gbk.length() < utf8.length()) {
                          bt = null;
                          bt = gbk.getBytes("UTF-8");
                          html = new String(bt, "UTF-8");
                          html = html.replaceFirst(
                                          "[cC][hH][aA][rR][sS][eE][tT]\\s*?=\\s*?([gG][bB]2312|[gG][bB][kK]|[gG][bB]18030)",
                                          "charset=utf-8");
                      } else if (gbk.length() > utf8.length()) {
                          html = buffer.toString();
                      } else {
                          html = buffer.toString();
                      }
                      buffer.close();
                      contentStr = new String("abc".getBytes(), "UTF-8");
                      contentStr = html;
      
                      in.close();
                      in = null;
                  }
              }
              else
              {
                  contentStr = null;
              }
          } catch (Exception e)
          {
              log.error(e);
          } finally
          {
              if (method != null)
                  method.releaseConnection();
          }
          return contentStr;
      }
      

      我使用该方法发布和获取返回内容。希望能帮到你。

      【讨论】:

        猜你喜欢
        • 2011-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-08
        • 1970-01-01
        • 1970-01-01
        • 2011-11-29
        • 2020-09-30
        相关资源
        最近更新 更多