【问题标题】:How to POST in Java如何在 Java 中发布
【发布时间】:2012-06-07 02:44:36
【问题描述】:

我有一些看起来像这样的东西:

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

grant_type=assertion&assertion_type=http%3A%2F%2Foauth.net%2Fgrant_type%2Fjwt%2F1.0%2Fbearer&assertion=eyJhbGciOiJSUzI1NiIs

我将如何在 Java 中使用它?我已经有了所有信息,所以我不需要解析它。

基本上我需要使用 3 个不同的数据进行 POST,并且使用 curl 对我有用,但我需要在 java 中进行:

curl -d 'grant_type=assertion&assertion_type=http%3A%2F%2Foauth.net%2Fgrant_type%2Fjwt%2F1.0%2Fbearer&assertion=eyJhbGciOiJSUzI1NiIsInR5i' https://accounts.google.com/o/oauth2/token

我切断了一些数据,以便更容易阅读,所以它不会工作。

所以一个大问题是 curl 可以工作,而我尝试的大多数 Java 教程都会给我 HTTP 响应错误 400。

我应该像这样编码日期:

String urlParameters = URLEncoder.encode("grant_type", "UTF-8") + "="+ URLEncoder.encode("assertion", "UTF-8") + "&" + URLEncoder.encode("assertion_type", "UTF-8") + "=" + URLEncoder.encode("http://oauth.net/grant_type/jwt/1.0/bearer", "UTF-8") + "&" + URLEncoder.encode("assertion", "UTF-8") + "=" + URLEncoder.encode(encodedMessage, "UTF-8");

或不:

String urlParameters ="grant_type=assertion&assertion_type=http://oauth.net/grant_type/jwt/1.0/bearer&assertion=" + encodedMessage;

使用这个作为代码:

URL url = new URL(targetURL);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);


OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());

writer.write(urlParameters);
writer.flush();
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = reader.readLine()) != null) {
     System.out.println(line);
}
writer.close();
reader.close();

【问题讨论】:

标签: java post web


【解决方案1】:

使用类似HttpClient 或类似的东西。

它可以将预 URL 编码的数据发布到 URI,虽然我不知道你是否可以只向它抛出一个完整的请求主体——可能需要解析它,但可能有这样的库好吧。

【讨论】:

    【解决方案2】:

    这是一个简单的 Apache HttpClient 示例,其请求正文来自 their docs(稍作修改以显示执行的工作原理):

    HttpClient client = new HttpClient();
    PostMethod post = new PostMethod("http://jakarata.apache.org/");
    NameValuePair[] data = {
        new NameValuePair("user", "joe"),
        new NameValuePair("password", "bloggs")
    };
    post.setRequestBody(data);
    int returnCode = client.execute(post);
    // check return code ...
    InputStream in = post.getResponseBodyAsStream();
    

    有关更多信息、示例和教程,请参阅Apache HttpClient siteThis link 也可能对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-17
      • 2021-07-19
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      相关资源
      最近更新 更多