java中,如何用POST方法将参数传递给第三方网站

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中,如何用POST方法将参数传递给第三方网站相关的知识,希望对你有一定的参考价值。

URL url = new URL(
"http://www.baidu.coml");

HttpURLConnection connection = (java.net.HttpURLConnection)url.openConnection();
connection.connect();
InputStream stream = connection.getInputStream();

上面是一段示例代码,即链接到www.baidu.com这个网站,现在我想动态的将一个参数传递给这个网站,然后得到它搜索后得到的html页面,比如,将java传递给它,得到百度搜索java这个关键字之后的页面,请高人指点。
上面的只是一个示例代码,其实我真正想要的不是百度的查询结果,百度的查询是get方式你可以在URL中追加想要查询的字符,但是如果是一个网站它用的方法是POST,没办法在URL中追加参数怎么办呢?

使用org.apache.commons.httpclient方便,效率又高,下面是post方式提交登录参数的代码:

public class FormLoginDemo

static final String LOGON_SITE = "developer.java.sun.com";
static final int LOGON_PORT = 80;

public FormLoginDemo()
super();


public static void main(String[] args) throws Exception

HttpClient client = new HttpClient();
client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT, "http");
PostMethod authpost = new PostMethod("/servlet/SessionServlet");
// 准备登录参数
NameValuePair action = new NameValuePair("action", "login");
NameValuePair url = new NameValuePair("url", "/index.html");
NameValuePair userid = new NameValuePair("UserId", "userid");
NameValuePair password = new NameValuePair("Password", "password");
authpost.setRequestBody(
new NameValuePair[] action, url, userid, password);
// 执行Post请求
client.executeMethod(authpost);
// 打印状态码
System.out.println("Login form post: " + authpost.getStatusLine().toString());
// 释放连接
authpost.releaseConnection();

参考技术A   把表单<form>的action属性设为第三方网站的处理程序地址就可以了。里面各<input>标签的name属性要与接受方一致

  你自己做程序的时候,表单提交给自己能做到吧?而提交给别人是一样的,唯一不同就是action地址打成别人的地址,参数名称改成别人网站需要的参数名称就可以了。
比如,你自己的程序
<form action="程序处理地址" method="post">
<input type="text" name="abc" /> 自己的程序里接受名为abc的参数
</form>
而别人的程序
<form action="http://第三方地址/程序" method="post">
<input type="text" name="这里的name值换成别人程序需要的" value="" />
</form>
参考技术B 提示:。。。
<form action="http://127.0.0.1:8080/1.jsp" method="post">
<input type="text" name="abc" value="fdfd">
<input type="hidden" name="bca" value="321321">
<input type="submit">
</form>

http请求正文内容为:
abc=fdfd&bca=321321
正文结束。没有回车换行
知道了吧。。
URL url = new URL("http://127.0.0.1:8080/1.jsp");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
OutputStream out = con.getOutputStream();
out.write("abc=123123&bca=321321".getBytes());
InputStream in = con.getInputStream();
上面的代码传参abc,bca
参考技术C 给你一个简单的html页面,你可以执行下看看是不是你想要的效果!

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<a href="http://www.baidu.com/s?wd=java">百度一下</a>
</body>
</html>
执行效果:点击之后,跳转到百度,并且显示java的查询条目!

关键点在于:找到这个第三方网站的查询字符串!
比如,你在百度搜索某个东西之后,地址栏是这样显示的:
http://www.baidu.com/s?wd="你所输入的信息的另一种编码显示"
也就是说,我们只需要提供一个类似的查询字符串即可!
你可以在服务器部分动态的给wd赋值即可!

如果是post的话,想要直接添加参数,然后传给第三方,然后返回第三方的执行结果,估计是不行的!从安全上考虑,java或者其他web开发语言都不会允许这样的事情发生! 不过,还是期待有解决办法出现!关注中...
参考技术D
可以人为的创建一个表单,然后给出需要的参数和值,用javascript来提交这个表单,就是模拟submit按钮的click

我可以将数组作为参数传递给 Java 中具有可变参数的方法吗?

【中文标题】我可以将数组作为参数传递给 Java 中具有可变参数的方法吗?【英文标题】:Can I pass an array as arguments to a method with variable arguments in Java? 【发布时间】:2011-02-24 21:24:48 【问题描述】:

我希望能够创建如下函数:

class A 
  private String extraVar;
  public String myFormat(String format, Object ... args)
    return String.format(format, extraVar, args);
  

这里的问题是args 在方法myFormat 中被视为Object[],因此是String.format 的单个参数,而我希望args 中的每个Object作为新参数传递。既然String.format也是一个带可变参数的方法,这应该是可以的。

如果这不可能,有没有像String.format(String format, Object[] args)这样的方法?在这种情况下,我可以使用新数组将 extraVar 前置到 args 并将其传递给该方法。

【问题讨论】:

我不禁想知道为什么这个问题是一个“这样有效”的问题。你就不能试一下吗?不要过度询问,你会弊大于利。 确实如此,这很容易测试。然而,这样的问题的好处在于它暴露了主题并征求了有趣的答案。 我实际上尝试了上面的代码,目的是将数组 args 作为参数传递给方法。但是,我没有意识到我应该先将 extraVar 添加到 args 中。当您知道变量参数被视为一个数组(甚至在方法之外)时,这当然是非常合乎逻辑的。 【参考方案1】:

variadic 方法function(Object... args) 的底层类型是 function(Object[] args)。 Sun 以这种方式添加可变参数以保持向后兼容性。

所以你应该可以在extraVar 前面加上args 并调用String.format(format, args)

【讨论】:

X[] 类型的参数传递给x(X... xs) 方法会在Eclipse 中给出以下警告:Type X[] of the last argument to method x(X...) doesn't exactly match the vararg parameter type. Cast to X[] to confirm the non-varargs invocation, or pass individual arguments of type X for a varargs invocation.【参考方案2】:

传递一个数组是可以的 - 实际上它相当于同一件事

String.format("%s %s", "hello", "world!");

相同
String.format("%s %s", new Object[]  "hello", "world!");

这只是语法糖 - 编译器将第一个转换为第二个,因为底层方法需要 vararg 参数的数组。

Varargs - J2SE 1.5 Documentation

【讨论】:

【参考方案3】:

jasonmp85 将不同的数组传递给String.format 是正确的。数组的大小一旦构造就无法更改,因此您必须传递一个新数组而不是修改现有数组。

Object newArgs = new Object[args.length+1];
System.arraycopy(args, 0, newArgs, 1, args.length);
newArgs[0] = extraVar; 
String.format(format, extraVar, args);

【讨论】:

【参考方案4】:

是的,T... 只是 T[] 的语法糖。

JLS 8.4.1 Format parameters

列表中的最后一个形参是特殊的;它可能是一个可变参数,由类型后面的省略号表示。

如果最后一个形参是T类型的可变参数,则认为定义了T[]类型的形参。然后该方法是一个variable arity 方法。否则,它是一个 fixed arity 方法。变量 arity 方法的调用可能包含比形式参数更多的实际参数表达式。所有与变量 arity 参数之前的形式参数不对应的实际参数表达式都将被计算,并将结果存储到一个数组中,该数组将传递给方法调用。

这里有一个例子来说明:

public static String ezFormat(Object... args) 
    String format = new String(new char[args.length])
        .replace("\0", "[ %s ]");
    return String.format(format, args);

public static void main(String... args) 
    System.out.println(ezFormat("A", "B", "C"));
    // prints "[ A ][ B ][ C ]"

是的,上面的main 方法是有效的,因为String... 只是String[]。另外,由于数组是协变的,String[] 就是Object[],所以你也可以调用ezFormat(args)

另见

Java language guide/varargs

可变参数陷阱#1:通过null

如何解析可变参数是相当复杂的,有时它会做一些让你吃惊的事情。

考虑这个例子:

static void count(Object... objs) 
    System.out.println(objs.length);


count(null, null, null); // prints "3"
count(null, null); // prints "2"
count(null); // throws java.lang.NullPointerException!!!

由于可变参数的解析方式,最后一条语句使用objs = null 调用,这当然会导致NullPointerException 使用objs.length。如果您想为可变参数提供一个 null 参数,您可以执行以下任一操作:

count(new Object[]  null ); // prints "1"
count((Object) null); // prints "1"

相关问题

以下是人们在处理可变参数时提出的一些问题示例:

bug with varargs and overloading? How to work with varargs and reflection Most specific method with matches of both fixed/variable arity (varargs)

可变参数陷阱 #2:添加额外参数

正如您所发现的,以下内容不起作用:

    String[] myArgs =  "A", "B", "C" ;
    System.out.println(ezFormat(myArgs, "Z"));
    // prints "[ [Ljava.lang.String;@13c5982 ][ Z ]"

由于可变参数的工作方式,ezFormat 实际上有 2 个参数,第一个是 String[],第二个是 String。如果您将一个数组传递给可变参数,并且您希望其元素被识别为单独的参数,并且您还需要添加一个额外的参数,那么您别无选择,只能创建 另一个数组容纳额外的元素。

这里有一些有用的辅助方法:

static <T> T[] append(T[] arr, T lastElement) 
    final int N = arr.length;
    arr = java.util.Arrays.copyOf(arr, N+1);
    arr[N] = lastElement;
    return arr;

static <T> T[] prepend(T[] arr, T firstElement) 
    final int N = arr.length;
    arr = java.util.Arrays.copyOf(arr, N+1);
    System.arraycopy(arr, 0, arr, 1, N);
    arr[0] = firstElement;
    return arr;

现在您可以执行以下操作:

    String[] myArgs =  "A", "B", "C" ;
    System.out.println(ezFormat(append(myArgs, "Z")));
    // prints "[ A ][ B ][ C ][ Z ]"

    System.out.println(ezFormat(prepend(myArgs, "Z")));
    // prints "[ Z ][ A ][ B ][ C ]"

可变参数陷阱 #3:传递一个基元数组

它“不起作用”:

    int[] myNumbers =  1, 2, 3 ;
    System.out.println(ezFormat(myNumbers));
    // prints "[ [I@13c5982 ]"

可变参数仅适用于引用类型。自动装箱不适用于基元数组。以下作品:

    Integer[] myNumbers =  1, 2, 3 ;
    System.out.println(ezFormat(myNumbers));
    // prints "[ 1 ][ 2 ][ 3 ]"

【讨论】:

使用 Object... 可变参数使得使用附加签名变得困难,因为编译器会识别签名之间的歧义,即使是原始参数也可以自动装箱到 Object。 缺少一个陷阱:如果你的方法有一个 Object 类型的最后一个参数...并且你调用它传递一个 String[] 例如。编译器不知道您的数组是可变参数的第一项还是等同于所有可变参数。它会警告你。 X[] 类型的参数传递给方法 x(X... xs) 在 Eclipse 中给出以下警告:Type X[] of the last argument to method x(X...) doesn't exactly match the vararg parameter type. Cast to X[] to confirm the non-varargs invocation, or pass individual arguments of type X for a varargs invocation. 将 X[] 返回到一个需要(X ... xs) 的方法...我怀疑它会被扩展。 StringUtils 中是否有一种方便的方法可以处理问题 #2,而无需将所有元素添加到单个输入数组参数中?例如:StringUtils.format(formatString, argArray, extraElement)【参考方案5】:

我遇到了同样的问题。

String[] arr= new String[]  "A", "B", "C" ;
Object obj = arr;

然后将 obj 作为 varargs 参数传递。 它奏效了。

【讨论】:

请也添加。

以上是关于java中,如何用POST方法将参数传递给第三方网站的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 Express post HTTP 方法?

如何将类型的对象作为参数传递给Web Api Get / Post方法

模型在使用 C# 将 POST 方法作为参数传递给 ASP.NET MVC 中同一控制器的 GET 方法时获取 NULL

如何用postman将一维int数组

如何将 POST 参数传递给 Durable Function,然后将此参数传递给 Timer Triggered 函数

如何将json POST数据作为对象传递给Web API方法?