2017-10-17 14 views
1

Node에서 Axios을 사용하여 Foursquare의 https://api.foursquare.com/v2/photos/add 끝점으로 JPEG 이미지를 가져오고 그 다음 POST 이미지를 가져 오려고합니다. 나는 Axios의 (및 우편 배달부)와 몇 가지 방법을 시도했지만 항상 Missing file upload의 동일한 오류 응답을 수신했습니다 : 이미지는 Axios의 GET 요청과 구글 정적지도 API를 사용하여 생성 및 검색됩니다Axius로 Fourstquare Checkin으로 사진을 가져 오십시오.

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

:

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

async 함수로 랩되고 버퍼를 성공적으로 반환합니다. 데이터는 Buffer로 읽고 문자열로 변환 :

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

Here's an example imageData string합니다. 또한 문자열을 base64으로 변환하려고 시도했습니다.

이 문자열은 포 스퀘어 엔드 포인트 POST 에디션은 다음 경우 : checkinId, oauth_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" } 
    } 
); 

.

다른 Content-Type 값을 , 다른 솔루션을 포럼 및 여기에있는 몇 가지 다른 솔루션을 인코딩했는데 시도했지만 아무 것도 작동하지 않습니다. 응답 errorDetail은 항상 Missing file upload라고 말합니다.

문제는 POST 요청이 구조화 된 방법 일 수 있지만 이미지 데이터를 잘못 요청하거나 처리 할 수도 있습니다. 확인하는 눈의 두 번째 (또는 세 번째 또는 네 번째) 세트는 함께 사용하면 도움이 될 것입니다.

답변

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); 
} 

그리고 짜잔는 요청이 성공하고 이미지가 포 스퀘어 체크인에 게시됩니다.