Я пытаюсь использовать API Tone Analyzer в приложении Laravel. Что бы я ни пробовал, я всегда получаю один и тот же ответ {"code":401, "error": "Unauthorized"}. Я подозреваю, что моя проблема в том, что я не могу понять, как передать ключ API, но официальная документация ничем не поможет, потому что она содержит только инструкции по использованию cURL в командной строке. Мой код в настоящее время выглядит так (хотя я пробовал много других итераций. Если кому-то я нужен, я также могу опубликовать все другие неудачные попытки):
$response = Curl::to('https://gateway-wdc.watsonplatform.net/tone-analyzer/api/v3/tone?version=2017-09-21&sentences=false')
->withOption('HTTPHEADER', array(
'Content-Type: application/json',
'apikey: REDACTED'))
->withData(array('text' => $text))
->asJson()
->post();
Я использую Laravel 5.8 и библиотеку cURL от Ixudra. Я бы предпочел, чтобы в ответах использовалась и эта библиотека, но, честно говоря, на данный момент я готов отказаться и использовать ванильный PHP в любом случае, поэтому любые ответы приветствуются.
Редактирование ниндзя: я знаю, что проблема не в моей учетной записи / ключе API, потому что я пытался получить доступ к API через командную строку, и это сработало так, как ожидалось. Проблема возникает только при попытке получить к ней доступ из Laravel.






Это код состояния 401, который используется для несанкционированного доступа, вам необходимо сначала войти в систему, прежде чем получить доступ к API.
Я проверяю документы для этого, и вот ссылка для входа в API перед его использованием. тон-анализатор # аутентификация
В некоторых экземплярах службы вы выполняете аутентификацию в API с помощью IAM. Вы можете передать либо токен носителя в заголовке авторизации, либо ключ API. Токены поддерживают аутентифицированные запросы без встраивания учетных данных службы в каждый вызов. Ключи API используют базовую аутентификацию.
Джесс STJ, я думаю, вы не получили мой ответ. Вы можете сделать это с помощью вашего класса curl или с помощью чистого php curl, если вы знаете о curl или можете использовать красивую библиотеку docs.guzzlephp.org/en/стабильный , это просто http-запрос, сначала вам нужно войти через http-запрос, как сказано в этой документации. взамен вы получите токен. и тогда каждый ваш запрос должен иметь этот токен.
Извините, но я до сих пор не понимаю, что вы имеете в виду. Я не могу войти, потому что у меня нет имени пользователя и пароля, все, что у меня есть, это ключ API. IBM даже заявляет, что использование имени пользователя и пароля теперь не рекомендуется в пользу использования этого ключа.
IBM Watson Services использует аутентификацию заголовков HTTP в формате Basic. Поэтому, используя curl в терминале, вы должны передать флаг -u or --user в формате user:password, или вы также можете отправить HTTP-заголовок аутентификации в шаблоне: Basic user:password.
Настроив свой код для этой второй формы, вы можете сделать это следующим образом:
$response = Curl::to('https://gateway-wdc.watsonplatform.net/tone-analyzer/api/v3/tone?version=2017-09-21&sentences=false')
->withHeader('Content-Type: application/json')
->withHeader('Authorization: Basic apikey:YOUR_TOKEN_HERE')
->withData(array('text' => $text))
->asJson()
->post();
Замените YOUR_TOKEN_HERE своим токеном доступа к Tone Analyzer API.
https://developer.mozilla.org/docs/Web/HTTP/Аутентификацияhttps://www.ibm.com/support/knowledgecenter/en/SSGMCP_5.3.0/com.ibm.cics.ts.internet.doc/topics/dfhtl2a.html
Надеюсь это поможет!
Спасибо за ответ, но он все еще не работает :( он все еще возвращает то же самое сообщение «401 Unauthorized».
Хорошо, подождите, я думаю, у меня это действительно работает. Мне пришлось заменить второй оператор withHeader() на ->withOption('USERPWD', 'apikey:[УДАЛЕНО]). Все еще отмечаю этот как лучший, потому что вы действительно помогли мне в этом.
Спасибо! Желаю успеха в вашем проекте!
Спасибо за ответ, но это документация по использованию cURL в командной строке. В вопросе я указал, что мне конкретно нужна помощь с доступом к нему с PHP. Я могу получить доступ к API из командной строки, поэтому я знаю, что проблема не в том, что я не авторизован; Я просто не могу понять, как построить вызов PHP.