У меня есть эта команда 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);
Я получаю 400 неверных запросов. Тип гранта не указан.




Хорошо, оказывается, проблема заключалась в настройке заголовка «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 только потому, что вы его использовали.
Какой ответ вы получаете?