2016-06-05 4 views
0

처음으로 fetch -api를 사용하여 문자열 화되지 않은 JSON 개체를 서버에 전달하는 데 문제가 있습니다. 는 기본적으로 나는이 같은 동작을 달성하고자 :가져 오기가 포함 된 문자열이 아닌 개체 보내기

$.post(url, {"test": "test"}, function(response) { 
    console.log(response); 
}); 

페치 방법은 unaccessable 나를 위해을 인 웹 API와 통신 일반 JSON 객체를 기대하고있다. 무엇을 인 ($_POST를 사용하는 경우 비어있는 것으로

fetch(url, { 
    method: 'POST', 
    body: {"test": "test"} 
}) 
    .then(data => data.json()) 
    .then(json => console.log(json)) 
    .catch(e => console.error(e)); 

몸 요청이 보인다

일반적으로 그냥 서버에 데이터를 전달하기 위해 FormData을 사용, 그러나 JSON 문자열 [Object object]로 변환됩니다 API가 사용하는 경우), file_get_contents('php://input)을 사용할 때 올바른 값을 제공합니다.

나는이 요청과 관련하여 잘못된 것 header과 관련이 있지만. 그래서 헤더 Ajax 포스트를 사용하려고 시도 : content-type:multipart/form-data;. 그러나 이것은 또한 어떤 가치도 얻지 못했습니다.

이것은 무언가를 데이터로 제공하는 평범한 JSON 개체를 사용하지 않으려 고 의도적으로 의도 한 것인지 아니면 단순히 누락 된 것인지 궁금합니다.



이 작업을 수행하지만,이 JSON 객체의 캐릭터 라인 화 버전으로 사용할 수 없습니다 :

var formData = new FormData(); 
formData.append('data', JSON.stringify(data)); 

fetch(url, { 
    method: 'POST', 
    body: formData 
}) 
    .then(data => data.json()) 
    .then(json => console.log(json)) 
    .catch(e => console.error(e)); 
+1

* JSON *은 어쨌든 단일 문자열 값이므로 'body : JSON.stringify (data)'를 사용해 보셨습니까? – CodingIntrigue

+0

@CodingIntrigue'formData'를 사용하지 않으면'$ _POST'와 함께 작동하지 않는 것처럼 보입니다. 그것이'fetch-api'가'formData' 객체를 사용할 때 자동으로 설정 헤더라고 생각한 이유입니다. – nkmol

+0

어, '$. post'스 니펫은 JSON을 전송하지 않습니까? – Bergi

답변

-1

먼저, $_POST에 의해 사용되는 POST 프로토콜에 게시해야합니다. 이제 방법 $.post 실제로 데이터가 직렬화 된 문자열을 생성함으로써되어 전송

fetch(url, { 
    headers: new Headers({'Content-Type': 'application/x-www-form-urlencoded'}), // Default header which $_POST listens to 
    ... 

: I는 반입 후 요청합니다 (docs에 기재된 $_POST 의해 사용되는 프로토콜이 인) application/x-www-form-urlencoded의 헤더를 부가함으로써 이것을 (예 : a%5Bone%5D=1)를 지정합니다.직렬화 된 문자열로 변환 객체를하려면 $.param를 사용할 수 있습니다

fetch(url, { 
      headers: new Headers({'Content-Type': 'application/x-www-form-urlencoded'}), // Default header which $_POST listens to 
      method: 'POST', 
      body: $.param(data) 
     }) 

이 간단한 $.post로 할 것 같은 당신이 할 수 $_POST에서 데이터를 retreive 할 수 있도록합니다.

+0

Downvoter,이 답변에 무엇이 잘못되었는지 알려주세요. – nkmol

0

것은 이제 데이터가 변수 var data = { a: "some data", b: 123 } 안에 가정 해 봅시다가.

var fdata = new FormData(); 
fdata.append('a', 'some data'); 
fdata.append('b', '123'); 

지금 당신이 데이터와 PHP를 보낼 수 있습니다

$_POST["a"] == "some data"; 
$_POST["b"] == 123; 

그런 다음 당신이 formData 형식으로 이런 식으로 데이터를 전송해야합니다 당신은이 필드를 이런 식으로 액세스 할 수 PHP의 코드를 원하는 경우 분리 된 필드 ab에 액세스 할 수 있지만 b 고지는 숫자가 아닌 문자열이됩니다.

배열을 보내려면 어떻게해야합니까? { c: ['hello', 'world', '!'] }을 가정 해 보겠습니다. 당신은 PHP 이름 규약을 따라야하고, 같은 이름을 여러 번 추가해야합니다

var fdata = new FormData(); 
fdata.append('c[]', 'hello'); 
fdata.append('c[]', 'world'); 
fdata.append('c[]', '!'); 

폼 데이터 인스턴스를 설정 한 후, 당신은 요청의 본문로 사용할 수 있습니다.

+0

시간 내 주셔서 감사합니다. 그러나, 명시된 바와 같이,'FormData'를 수동으로 생성해도 필자는 원하는대로 동적으로 만들 수 없습니다. 나는 대답을 찾았습니다, 새로운 대답을 만들 것입니다 :) – nkmol

+0

나는 당신이 달성하고자했던 역 동성의 수준을 이해하지 못합니다. 실제로 쿼리 문자열 솔루션은 길이 제한이 있기 때문에 훨씬 더 심각하며 많은 양의 데이터를 보낼 수 없습니다. – Salva

+0

URL 인코딩 된 문자열을 쿼리 문자열로 사용하지는 않지만 게시 본문으로 사용하므로 길이 제한이 없어야합니다. – Salva

관련 문제