Загрузка API Strava V3 с помощью Scribe (в Google App Engine)

Я пытаюсь использовать Scribe для загрузки файла GPX (не сжатого) в Strava, используя их API V3 (с Java, в Google App Engine):

String url = "https://www.strava.com/api/v3/uploads?access_token=<TOKEN>";
OAuthRequest req = new OAuthRequest(Verb.POST, url);
req.addQuerystringParameter("private", "1");
req.addQuerystringParameter("activity_type", "bike");
req.addQuerystringParameter("data_type", "gpx");
req.addQuerystringParameter("external_id", <Unique String>);

req.addHeader("Content-Type", "multipart/form-data");
String gpx = <Content of GPX file to Upload>;

req.addBodyParameter("file", gpx);

Response response = request.send();

В результате я получаю код ответа 500 (внутренняя ошибка) от Strava, и он не загружает активность GPX.

Я предполагаю, что это проблема, связанная с тем, как я формирую составной HTTP POST, который определен в документации Strava здесь как:

DEFINITION
POST https://www.strava.com/api/v3/uploads
EXAMPLE REQUEST
$ curl -X POST https://www.strava.com/api/v3/uploads \
-F access_token=83ebeabdec09f6670863766f792ead24d61fe3f9 \
-F activity_type=ride \
-F [email protected] \
-F data_type=fit


Parameters:
<OTHERS>
file: multipart/form-data required 
the actual activity data, if gzipped the data_type must end with .gz

Любые идеи о том, как я могу сделать эту работу, пожалуйста? Спасибо.

РЕДАКТИРОВАТЬ: Обнаружил несколько вещей в ходе моих собственных дальнейших исследований:

  • Scribe — это просто подписание oauth, поэтому автор не сосредотачивается на добавлении функциональности для обработки multipart/form-data (хотя люди предлагали такие дополнения)
  • Я мог бы использовать один из классов Apache (MultipartEntity) для этого со Scribe, за исключением того, что я думаю, что библиотека Apache не поддерживается в Google App Engine. См. эту ветку, которая быть идеальным, за исключением проблемы с Apache/GAE

person nickpharris    schedule 04.12.2013    source источник


Ответы (2)


Это полное решение. Передайте свой токен носителя и имя файла для загрузки. Это для файлов FIT, но было бы простым изменением для GPX. Взято отсюда:

https://github.com/davidzof/strava-oauth/

public static long uploadActivity(String bearer, String fileName) {
    JSONObject jsonObj = null;

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost(
            "https://www.strava.com/api/v3/uploads");
    httpPost.addHeader("Authorization", "Bearer " + bearer);
    httpPost.setHeader("enctype", "multipart/form-data");

    MultipartEntity reqEntity = new MultipartEntity(
            HttpMultipartMode.BROWSER_COMPATIBLE);
    try {
        reqEntity.addPart("activity_type", new StringBody("ride"));
        reqEntity.addPart("data_type", new StringBody("fit"));
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    FileBody bin = new FileBody(new File(fileName));
    reqEntity.addPart("file", bin);

    httpPost.setEntity(reqEntity);

    HttpResponse response;
    try {
        response = httpClient.execute(httpPost);

        HttpEntity respEntity = response.getEntity();

        if (respEntity != null) {
            // EntityUtils to get the response content
            String content = EntityUtils.toString(respEntity);
            System.out.println(content);
            JSONParser jsonParser = new JSONParser();
            jsonObj = (JSONObject) jsonParser.parse(content);
        }
    } catch (ParseException | IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

    return (long) jsonObj.get("id");
}
person David George    schedule 27.03.2015

В конце концов я нашел это решение в Stack Overflow, которое дало возможность использовать класс Apache.

MultipartEntity

в рамках ограничений Google App Engine. Мне просто нужно было добавить три JAR-файла Apache в мой проект GAE: httpclient-4.3.1.jar, httpcore-4.3.jar и httpmime-4.3.1.jar.

Затем я объединил с это решение, которое позволило мне добавить

FileBody

к

MultipartEntity

(в моем случае «файл» GPX я создал в строке). Вместе эти два решения работали отлично!

person nickpharris    schedule 06.12.2013