#ios #swift #api #twitter
#iOS #swift #API #Twitter
Вопрос:
Я пытаюсь создать TwitterSearcher.
Мои условия таковы
- Использование аутентификации только для приложений
- стандартный поисковый API
- Используя Alamofire, SwiftyJSON
Как некоторые из вас знают, вам необходимо получить токен, чтобы получить доступ к Twitter перед поиском твитов.
Я довольно новичок в использовании самого API, но я едва внедрил некоторый код. Тем не менее, я наткнулся на приведенный ниже ответ об ошибке при получении токена.
{
"errors" : [
{
"code" : 170,
"label" : "forbidden_missing_parameter",
"message" : "Missing required parameter: grant_type"
}
]
}
Я уже пробовал некоторые способы, ссылаясь на другие статьи, скажем
- изменение параметра на [«полезная нагрузка»: «grant_type=client_credentials»]
- исключите «content_type» из заголовка
Хотя я не уловил значения этих двух, ошибка все еще продолжается.
import Foundation
import Alamofire
import SwiftyJSON
protocol SearchUserApi {
func getToken()
func getTweets(content: String)
}
class APIOperator: SearchUserApi {
var accessToken: String?
let tokenApi = "https://api.twitter.com/oauth2/token"
let api = "https://api.twitter.com/1.1/search/tweets.json"
let consumerKey = "---"
let consumerSecret = "---"
func getToken() {
let credentials = "(consumerKey):(consumerSecret)".data(using: String.Encoding.utf8)!.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
let headers = [
"Authorization" : "Basic (credentials)",
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
]
let params: [String : AnyObject] = ["grant_type": "client_credentials" as AnyObject]
Alamofire.request(
tokenApi,
method: .post,
parameters: params,
encoding: JSONEncoding.default,
headers: headers
)
.responseJSON { (response) in
guard let object = response.result.value else {
print("Getting token is failed")
return
}
let json = JSON(object)
print(json)
}
}
func getTweets(content: String) {
print("not yet")
}
}
Надеюсь, вы, ребята, мне поможете.
Ответ №1:
Вы можете попробовать с URLEncoding.httpBody
вместо JSONEncoding.default
или
Alamofire напрямую поддерживает базовую аутентификацию
смотрите это
https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#authentication
Вот пример кода из документов
let user = "user"
let password = "password"
let credential = URLCredential(user: user, password: password, persistence: .forSession)
Alamofire.request("https://httpbin.org/basic-auth/(user)/(password)")
.authenticate(usingCredential: credential)
.responseJSON { response in
debugPrint(response)
}
и использовать authorizationHeader
в качестве заголовка запроса в alamofire
Надеюсь, это полезно
Комментарии:
1. Спасибо за комментарий. я действительно читал Github, но я не мог понять, куда делись параметры и заголовки. В случае использования
authorizationHeader
вам не нужно добавлять авторизацию, content_type и grant_type, как указано выше? И пользователь и пароль подразумевают пользовательский ключ и секрет в этом случае? Потому что это доступно только для приложений.2. КСТАТИ
URLEncoding.httpBody
, по-видимому, работает!! Спасибо.3. @lyn Я видел другой вопрос и обнаружил, что grant_type следует передавать как строку, а не как тело HTTP. Пожалуйста, отметьте мой ответ как принятый, если он полезен.