【问题标题】:Grails encoded params Post RequestGrails 编码的参数发布请求
【发布时间】:2019-09-26 23:30:03
【问题描述】:

我正在尝试完成 Instagram Oauth 流程,

我目前有用于交换访问令牌的授权代码。我要向这个端点发出一个 x-www-form-urlencoded POST 请求

https://api.instagram.com/oauth/access_token?”

这是我到目前为止所做的。

String query = "https://api.instagram.com/oauth/access_token/?client_id=" + clientId +"&client_secret="+ clientSecret+ "&grant_type=authorization_code&redirect_uri="+ redirectUri + "&code=" + code

String response = new URL(query).getText()

响应应为 JSON 字符串。

请记住,我是初学者。

【问题讨论】:

    标签: java grails groovy


    【解决方案1】:

    我没有阅读 Instagram 文档,但根据您的示例代码,有几点需要记住:

    • 您提到您必须发出 POST 请求,您的示例发出 GET 请求
    • 切勿使用不受信任的参数值构建 URL。这基本上意味着:总是编码参数,从不信任它们。

    有许多第 3 方 HTTP 请求库可让您灵活且更轻松地了解超时和重定向等方面。 Java 11 有一个内置的 HTTP 客户端,也可以缓解这种情况。但是,使用基本的 Java 连接原语构建问题中提供的代码,这可能有效:

    URL url = new URL("https://api.instagram.com/oauth/access_token/?client_id=${URLEncoder.encode(clientId, 'UTF-8')}&client_secret=${URLEncoder.encode(clientSecret, 'UTF-8')}&grant_type=authorization_code&redirect_uri=${URLEncoder.encode(redirectUri, 'UTF-8')}&code=${URLEncoder.encode(code, 'UTF-8')}")
    def jsonString = ((HttpURLConnection) url.openConnection()).with {
        setRequestMethod('POST')
        setRequestProperty('Accept', 'application/json')
        setDoInput(true)
        connect()
    
        if (getResponseCode() >= 400)
            throw new Exception("Error code = ${getResponseCode()}")
    
        inputStream.text
    }
    

    每个 URL 参数都经过编码,以便它们包含的任何非 URL 安全字符都是安全的,然后我们告诉连接它将是一个“POST”,并且我们希望返回 json 作为输入。 inputStream.text 是从连接中获取输入流并读取所有内容然后关闭流的常规代码。因为它是with闭包的最后一行,所以它会自动作为闭包的值返回并分配给变量jsonString

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 1970-01-01
      • 2019-06-19
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多