50552


codeをもらうところまでは正常に動いておりますが、AccessTokenをもらうPOSTを実行すると

[code]

    SUCCESS: {
        error = "Internal Server Error";
        status = 500;
    }
    
[/code]

が帰ってきてAccessTokenをもらうことが出来ません。  
AccessTokenを返してもらうにはどうしたらいいのでしょうか？

以下ソースコードです

[code]

    class AuthViewController: UIViewController, WKNavigationDelegate {
    
        private var webView: WKWebView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let url = URL(string: "https://qiita.com/api/v2/oauth/authorize?client_id=\(AppUser.clientID)&scope=read_qiita+write_qiita")
            let urlRequest = URLRequest(url: url!)
            self.webView.load(urlRequest)
        }
    
        override func loadView() {
            let webConfiguration = WKWebViewConfiguration()
            webView = WKWebView(frame: .zero, configuration: webConfiguration)
            webView.navigationDelegate = self
            self.view = self.webView
        }
    
        func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
            if navigationAction.request.url?.scheme == "tomoki-qiita-client" {
                if navigationAction.request.url?.host == "oauth" && navigationAction.request.url?.lastPathComponent == "qiita" {
                    let code = getQueryStringParameter(url: (navigationAction.request.url?.absoluteString)!, param: "code")
                    getAccessToken(code: code)
                }
            }
            decisionHandler(WKNavigationActionPolicy.allow)
        }
    
        private func getQueryStringParameter(url: String, param: String) -> String? {
            guard let url = URLComponents(string: url) else { return nil }
            return url.queryItems?.first(where: { $0.name == param })?.value
        }
    
        private func getAccessToken(code: String!) {
            let url = "https://qiita.com/api/v2/access_tokens"
            guard let code = code else { return }
    
            // 受信可能なレスポンスデータのメディアタイプを指定
            let headers = [
                "ACCEPT": "application/json"
            ]
    
            // 認証に必要な値を設定
            let parameters: Parameters = [
                "client_id": AppUser.clientID,
                "client_secret": AppUser.clientSecret,
                "code": code
            ]
    
            Alamofire.request(url, method: .post, parameters: parameters, headers: headers).responseJSON{ response in
                print(parameters)
                print(url)
                print(headers)
                print(response)
                switch response.result {
                case .success:
                    print(response)
    //                let json = JSON(response.result.value)
    //
    //                // アクセストークンを取得
    //                let accessToken = json["access_token"].string
    //                UserDefaults.standard.set(accessToken!, forKey: ACCESS_TOKEN)
    //                completion()
                case .failure(let error):
                    print(error)
                }
            }
        }    
    }
    
[/code]

QiitaAPIのドキュメントはこちらです  
<https://qiita.com/api/v2/docs#%E8%AA%8D%E8%A8%BC%E8%AA%8D%E5%8F%AF>


CC BY-SA 4.0
2018-11-22T17:27:00.777
50547
2018-11-23T02:33:08.010
2018-11-23T00:31:01.670
19110
28496
question
swift api oauth
QiitaAPIのOAuthについて


省略可能なのかも知れませんが、`parameters: parameters, encoding:
JSONEncoding.default`の様に、`encoding`指定が必要では無いでしょうか？

また、JSON形式のテキストを`POST`するので、`httpHeader`は、

[code]

        let headers = [
            "Content-type": "application/json",
            "ACCEPT": "application/json"
        ]
    
[/code]

と、送信形式が`JSON`であることを明示しなければいけないのではないでしょうか？


CC BY-SA 4.0
2018-11-23T01:07:13.553
50552
2018-11-23T02:33:08.010
2018-11-23T02:33:08.010
14745
14745
50547
answer