Как я могу воспроизвести эту команду curl, используя запрос Jetty в java?

У меня есть эта команда curl

curl -F 'client_id = {client id}' \
-F 'client_secret = {client secret}' \
-F 'code = {temporary token}' \
-F 'grant_type=authorization_code' \
https://cloud.lightspeedapp.com/oauth/access_token.php

взято с https://developers.lightspeedhq.com/retail/authentication/access-token/

Я пытаюсь вызвать этот API, используя запрос причала в java. Вот что у меня есть до сих пор.

URIBuilder uriBuilder = new URIBuilder("https://cloud.lightspeedapp.com")
  .setPath("/oauth/access_token.php");

MultiPartContentProvider contentProvider = new MultiPartContentProvider();
contentProvider.addFieldPart("grant_type", new StringContentProvider("authorization_code"), null);
contentProvider.addFieldPart("client_id", new StringContentProvider(lightspeedRId), null);
contentProvider.addFieldPart("client_secret", new StringContentProvider(lightspeedRSecret), null);
contentProvider.addFieldPart("code", new StringContentProvider(temporaryToken), null);
contentProvider.close();

Request request = httpClient.POST(uriBuilder.build())
  .content(contentProvider)
  .header("Content-Type", "multipart/form-data");

Однако это не работает. Я в полной растерянности и не уверен, что мне нужно изменить здесь.

Обновлено: я тоже попробовал FormContentProvider и получил те же результаты.

Fields fields = new Fields();
fields.put("grant_type", "authorization_code");
fields.put("client_id", lightspeedRId);
fields.put("client_secret", lightspeedRSecret);
fields.put("code",temporaryToken);
FormContentProvider contentProvider = new FormContentProvider(fields);

Какой ответ вы получаете?

tgdavies 06.10.2022 22:50

Я получаю 400 неверных запросов. Тип гранта не указан.

Nic Estrada 06.10.2022 23:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, оказывается, проблема заключалась в настройке заголовка «Content-Type» в запросе в конце.

Request request = httpClient.POST(uriBuilder.build())
  .content(contentProvider)
  .header("Content-Type", "multipart/form-data");

Без этого он работал отлично, как это.

URIBuilder uriBuilder = new URIBuilder("https://cloud.lightspeedapp.com")
  .setPath("/oauth/access_token.php");

Fields fields = new Fields();
fields.put("grant_type", "authorization_code");
fields.put("client_id", lightspeedRId);
fields.put("client_secret", lightspeedRSecret);
fields.put("code",temporaryToken);
FormContentProvider contentProvider = new FormContentProvider(fields);

Request request = httpClient.POST(uriBuilder.build())
  .content(contentProvider);

Причина, по которой я установил этот заголовок в первую очередь, заключалась в этой части документации.

Так что да, оказывается, у Lightspeed просто ужасная документация. Пусть это будет поучительной историей.

Также FormContentProvider предоставляет Content-Type из multipart/form-data только потому, что вы его использовали.

Joakim Erdfelt 12.10.2022 20:41

Другие вопросы по теме