当前位置: 首页 > 知识库问答 >
问题:

Play framework,设置HTTP POST请求头

翁和正
2023-03-14

在Play框架中使用Google Plus Sign In Api时,是否必须以不同的方式设置头?是不是我做错了什么?

    null
    null
{
  "code": "Security Code Returned from Step 1",
  "client_id": "Client Id that was given to you in GApi Console",
  "client_secret": "Client Secret that was given to you in the GApi Console",
  "redirect_uri": "Redirect Uri you specified in the GApi Console",
  "grant_type": "authorization_code"
}

然而,当我使用所有正确的参数发出此请求时,我得到了这个错误

{
  "error" : "invalid_request",
  "error_description" : "Required parameter is missing: grant_type"
}

要在Play Framework中发出HTTP请求,您可以使用WS Library。我这样提出要求

public static F.Promise<Result> OAuthCallback(String state, String code){
  /*
    Note:
      - The GoogleStrategy class is just a class that holds all my GApi credentials
      - The parameters (String state, String code) are just GET params from Step 1, returned by the GApi
  */

  //Make URL builder
  WSRequestHolder requestHolder = WS.url(GoogleStrategy.getTokenUrl);

  //Set headers
  requestHolder.setHeader("code", code);
  requestHolder.setHeader("client_id", GoogleStrategy.clientId);
  requestHolder.setHeader("client_secret", GoogleStrategy.clientSecret);
  requestHolder.setHeader("redirect_uri", GoogleStrategy.redirectUri);
  requestHolder.setHeader("grant_type", GoogleStrategy.grantType);//GoogleStrategy.grantType = "authorization_code"

  //Make HTTP request and tell program what to do once the HTTP request is finished
  F.Promise<Result> getTokenPromise = requestHolder.post("").map(
    new F.Function<WSResponse, Result>() {
      public Result apply(WSResponse response){
        return ok(response.asJson());//Returning result for debugging
      }
    }
  );

  return getTokenPromise;//Return promise, Play Framework will handle the Asynchronous stuff
}

如您所见,我设置了头部grant_type。为了确保设置头的工作正常,我制作了一个程序,在NodeJS(源代码)中吐出请求的头,这就是结果

{
  "HEADERS": {
    "host": "127.0.0.1:3000",
    "code": "4/qazYoReIJZAYO9izlTjjJA.gihwUJ6zgoERgtL038sCVnsvSfAJkgI",
    "grant_type": "authorization_code",
    "client_secret": "XXXX-CENSORED FOR SECURITY PURPOSES-XXX",
    "redirect_uri": "http://127.0.0.1:9000/api/users/auth/google/callback",
    "client_id": "XXXX-CENSORED FOR SECURITY PURPOSES-XXX",
    "content-type": "text/plain; charset=utf-8",
    "connection": "keep-alive",
    "accept": "*/*",
    "user-agent": "NING/1.0",
    "content-length": "14"
  }
}

共有1个答案

席兴朝
2023-03-14

我认为这些不是作为头部发送的,而是作为一个整体发送的。在您提供的链接中有一个示例:

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

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
redirect_uri=https://oauth2-login-demo.appspot.com/code&
grant_type=authorization_code

因此将它们传递给您的POST调用:

StringBuilder sb = new StringBuilder();
sb.append("code=").append(code)
    .append("&client_id=").append(GoogleStrategy.clientId)
    .append("&client_secret=").append( GoogleStrategy.clientSecret)
    .append("&redirect_uri=").append(GoogleStrategy.redirectUri)
    .append("&grant_type=").append(GoogleStrategy.grantType)

requestHolder.setContentType("application/x-www-form-urlencoded")
    .post(sb.toString());
 类似资料:
  • 对传递的 URL 发出一个 POST 请求。 使用 XMLHttpRequest web api 对给定的url 发出一个 post 请求。 用 setRequestHeader 方法设置 HTTP 请求头的值。 通过调用给定的 callback 和 responseText 来处理 onload 事件。 通过运行提供的 err 函数,处理onerror事件。 省略第三个参数 data ,不发送数

  • 本文向大家介绍playframework Java:接受JSON请求,包括了playframework Java:接受JSON请求的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 我需要一个java程序来生成以下请求。我正在使用Apache HttpClient Library,但仍然无法生成这样的请求: 这是我的python程序生成的,我编写了一个等效的java程序。但它扔403。 2012-09-10 15:12:05G信息:G2OAuth auth data=“3,0.0.0,0.0.0,1347289925,3223833979,crlakamai”2012-09-

  • 问题内容: 在使用XMLHttpRequest进行AJAX调用时,似乎无法从JavaScript更改大多数请求标头。请注意,必须在Gecko浏览器中调用when。设置_Referer时_ ,它没有设置(我查看了使用Firebug和Tamper Data发送的请求标头)。当我设置User-Agent时,它完全搞砸了AJAX调用。但是,设置接受和_内容类型_确实可以。我们是否无法在Firefox 3中

  • 问题内容: 使用PHP,是否可以使用发送HTTP标头? 我知道您可以从文件中发送用户代理。但是,你能不能也发送其他信息,如,和用? 还是有另一个功能可以完成此任务? 问题答案: 实际上,在进一步阅读该功能后: 您也许可以遵循这种模式来实现您想要的目标,但是我还没有亲自测试过。(如果它不起作用,请随时查看我的其他答案)

  • 我的应用程序中有一个特定的请求需要基本身份验证,所以我需要为该请求设置授权头。我读过关于设置HTTP请求头的内容,但据我所知,它将为该方法的所有请求设置该头。我的代码中有这样的内容: 但我不希望我的每一个帖子请求都发送这个标题。有没有办法只为我想要的一个请求发送标题?还是在我提出请求后必须将其移除?