2017-10-17 3 views
1

ノード内でAxiosを使用して、Foursquareのhttps://api.foursquare.com/v2/photos/addエンドポイントにJPEG画像を取得しようとしています。POST JPEG画像を取得しようとしています。私はAxios(およびポストマン)と、いくつかの方法を試してみましたが、常にMissing file uploadの同じエラー応答を受信しました:AxiusでFoursquare Checkinに写真をポストします

{ 
    "meta": { 
    "code": 400, 
    "errorType": "other", 
    "errorDetail": "Missing file upload", 
    "requestId": "NNNNNNNNNNNNNNNNNNNNN" // not the true requestId 
    }, 
    "notifications": [ 
    { 
     "type": "notificationTray", 
     "item": { 
     "unreadCount": 0 
     } 
    } 
    ], 
    "response": {} 
} 

画像をGoogle静的マップのAPIを使用して作成し、Axios GETリクエストで取得されています

const image = await axios.get(imageURL, { 
    responseType: "arraybuffer" 
}); 

async関数でラップされ、正常にバッファを返します。データはBufferに読み込まれ、文字列に変換されます。

const imageData = new Buffer(image, "binary").toString(); 

Here's an example imageData string。また、文字列をbase64に変換しようとしました。 checkinIdoauth_tokenvのparamsはすべて有効です

const postPhoto = await axios.post(
    "https://developer.foursquare.com/docs/api/photos/add? 
    checkinId=1234& 
    oauth_token=[TOKEN]& 
    v=YYYYMMDD", 
    imageData, 
    { 
    headers: { "Content-Type": "image/jpeg" } 
    } 
); 

この文字列は、フォースクエアエンドポイントへPOST編です。

私はimageDataをコード化したの値と他のいくつかの解決策をフォーラムで見つけましたが、ここではほとんど(数年前です)、何も動作しませんでした。レスポンスerrorDetailは常にMissing file uploadと表示されます。

問題はPOSTリクエストの構造にある可能性がありますが、画像データの要求/処理が正しくない可能性があります。私がこれをまとめていることを確認する目の第2(または第3または第4)目は、非常に役立つでしょう。

答えて

1

私はついにこれを解決しました。

私は最終的にいくつかのヒントを提供したPostmanを通して働かせることができました。ここでrequestを使用して郵便配達のコードスニペットです:

var fs = require("fs"); 
var request = require("request"); 

var options = { method: 'POST', 
    url: 'https://api.foursquare.com/v2/photos/add', 
    qs: 
    { checkinId: [MY CHECKING ID], 
    public: '1', 
    oauth_token: [MY OAUTH TOKEN], 
    v: [MY VERSION] }, 
    headers: 
    { 'postman-token': '8ce14473-b457-7f1a-eae2-ba384e99b983', 
    'cache-control': 'no-cache', 
    'content-type': 'multipart/form-data; boundary=---- WebKitFormBoundary7MA4YWxkTrZu0gW' }, 
    formData: 
    { file: 
     { value: 'fs.createReadStream("testimage.jpg")', 
     options: { 
      filename: 'testimage.jpg', 
      contentType: null 
     } 
     } 
    } 
    }; 

request(options, function (error, response, body) { 
    if (error) throw new Error(error); 

    console.log(body); 
}); 

このキーの一部がfs.createReadStream()ました。前に欠落していた部分は、画像をリクエストにストリームとして渡すことでした。私はAxios要求を把握することができました。この使用

const axios = require("axios"); 
const querystring = require("qs"); 
const FormData = require("form-data"); 

const getImageStream = async function(url) { 
    return await axios 
    .get(url, { 
     responseType: "stream" 
    }) 
    .then(response => response.data); 
}; 

let form = new FormData(); 
form.append("file", getImageStream([IMAGE URL])); 

const requestURL = "https://api.foursquare.com/v2/photos/add"; 
const requestParams = { 
    checkinId: [MY CHECKIN ID], 
    public: 1, 
    oauth_token: [MY OAUTH TOKEN], 
    v: [MY VERSION] 
}; 
const requestConfig = { 
    headers: form.getHeaders() 
}; 

try { 
    const postPhoto = await axios.post(
    requestURL + "?" + querystring.stringify(requestParams), 
    form, 
    requestConfig 
); 

    return postPhoto; 
} catch (e) { 
    console.error(e.response); 
} 

出来上がりは、要求が成功し、画像はフォースクエアのチェックインに掲載されています。

関連する問題