0

를 가져올 사용하여 POST 방법 : 내가 isomorphic-fetch를 사용하여이 요청을 재현하기 위해 노력하고있어다중/폼 데이터 헤더와 FormData이 잘 작동 CURL 예입니다

curl -X POST \ 
    <url> \ 
    -H 'authorization: Bearer <token>' \ 
    -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \ 
    -F [email protected] \ 
    -F userId=<userId> 

.

const formData = new FormData(); 
formData.append('file', file); 
formData.append('userId', userId); 

return fetch(`<url>`, {  
    method: 'POST', 
    headers: { 
    'Content-Length': file.length 
    'Authorization: Bearer <authorization token>', 
    'Content-Type': 'multipart/form-data' 
    }, 
    body: formData 
})` 

내가 FormData에 전달 된 file을 생성하기 위해 fs.readFileSync를 사용

나는 다음과 같은 코드를 시도했습니다.

위의 예는 (헤더를 통해 전송) 토큰에 포함 된 userIduserIdformData에서 전달 일치하지 않는 없다는 오류 메시지와 함께 401 HTTP 상태 코드 (무단)을 반환합니다.

그래서 내 생각에 REST API에 도착한 FormData이 적절히 형성되지 않았다는 것입니다.

문제

Content-Length 헤더와 관련이있을 수 있습니다,하지만 난 (내가 Content-Length 헤더를 사용하지 않는 경우 내가 411 HTTP 상태 코드 Content-Length 헤더 누락 수)을 계산하는 더 좋은 방법을 찾지 못했습니다.

Content-Length 헤더의 값이 올바르지 않아 실패 할 수 있습니까?

왜 이것이 실패하고 더 좋은 방법을 디버깅하는 지에 대한 다른 제안 사항이 있습니까?

이 문제를 명확히하려면 추가 정보가 필요하면 질문하십시오.

문제가 같은 (401 오류 HTTP 상태 코드 응답) 유지 그러나 나는 방법 formData.getLengthSync()

를 사용하여 올바른 Content-Length 값을 얻기 위해 form-data 모듈을 시도했습니다

UPDATE.

+0

를 드롭 'Content-Type' 요청 헤더는 다중 부분 경계를 포함하도록 브라우저에 의해 자동으로 생성되어야합니다. 나는 당신이 그것과'Content-Length' 헤더를 버리면 괜찮을 것이라고 생각합니다. – idbehold

+0

나는 그것을 성공하지 않고 이미 시도해 보았습니다.'Content-Length' 헤더를 보내지 않으면'API'가'411' 오류 HTTP 상태 코드를 반환합니다 :'서버가 정의 된 Content- Length' – rfc1484

+0

Content-Length를 12345로 설정하십시오. 업로드하려는 서버가 잘 설계되지 않았습니다. – idbehold

답변

2

당신이 당신의 네트워크 관리자를 열 경우,이 코드를 실행하고 Content-Length이 올바르게 설정되어 있는지보아야한다 양식을 제출

const foo = document.getElementById('foo') 
 
foo.addEventListener('submit', (e) => { 
 
    e.preventDefault() 
 
    const formData = new FormData(foo) 
 
    formData.append('userId', 123) 
 
    fetch('//example.com', { 
 
    method: 'POST', 
 
    body: formData 
 
    }) 
 
})
<form id="foo"> 
 
    <input id="file" type="file" name="file"/><br><br> 
 
    <button type="submit">Submit</button> 
 
</form>

+0

그래서 올바르게 이해한다면 클라이언트 구현에는 문제가 없지만 REST API 구현 ('Content-Length' 헤더가 전달되지 않을 때'411' 오류 HTTP 상태 코드를 반환하지 않아야 함을 의미 함) – rfc1484

+0

@ rfc1484'Content-Length'와'Content-Type' 헤더가 모두 브라우저에 의해 자동으로 설정되기 때문에'fetch()'설정에서 지정해야하는 유일한 헤더는'Authorization' 헤더입니다. 따라서 코드에서 두 줄만 제거하십시오. – idbehold

+0

나는 이해한다. 그러나 나는 이미 그 해결책을 시도했지만 작동하지 않았다. (앞에서 언급 한'411' 오류를 반환했다.) 단위 테스트를 사용하여 테스트 중이므로 문제는 요청이 서버 쪽에서 수행된다는 것입니다. 따라서이 경우 헤더가 브라우저에서 자동으로 설정되지 않습니다. 브라우저를 사용하고'node-fetch' 라이브러리를 직접 사용합니다 (서버 측 요청을 수행 할 때'isomorphic-fetch'가 사용하는 기본 라이브러리). 단위 테스트가 현재 실패하고 있지만 이것이'클라이언트 측 '에서 작동 할 수도 있습니다. – rfc1484