React-Native Fetch“POST”请求在Android中抛出“SyntaxError:JSON输入的意外结束”

时间:2016-05-12 10:41:48

标签: json http-post react-native

这是我的功能
不知道问题出在哪里

fetchData() {
        fetch(REQUEST_URL, {
      method: 'POST',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        Request : 'menu',
        active : '1',
      })
    }).then((response) => response.json())
    .then((responseData) => {
        this.setState({
              menu: responseData.Response,
          }); 
    })
    .catch((error) => {
      console.warn('error',error);
    })
    .done();
      }

请指出功能

中的问题

6 个答案:

答案 0 :(得分:5)

错误发生,因为您的响应无法转换为JSON格式。由于错误的标头,响应正文或基于您的服务器的其他各种原因,可能会发生此问题。要做的事情 - 因为显然响应不一致 - 是在尝试将响应转换为JSON之前执行服务器响应的额外验证。

您可以通过替换:

.then((response) => response.json())

.then((response) => {
  // In this case, we check the content-type of the response
  if (response.headers.get('content-type').match(/application\/json/)) {
    return response.json();
  }
  return response;
  // You can also try "return response.text();"
 })

答案 1 :(得分:2)

    The error will be  occcurs because your response can not be casted to be JSON 
    format.

    there are  three  type of php mysqli api formate 

    1 formData 
    2 xml
    3 json 

   i think you  are use Formdata api  but you are request in json see  formdata  
    example

1) json Request..    example

        var Request = {
            security:1,
            token: token,
            email: this.state.username,
            password: this.state.password
          };
          console.log(JSON.stringify(Request));
                fetch(API.login, {
                  method: "POST",
                  headers: {
                    Accept: "application/json",
                    "Content-Type": "application/json"
                  },
                  body: JSON.stringify(Request)
                })
                  .then(res => res.json())
                  .then(res => {
                    console.log("Login RESPONCE:::  ", res);
                  }

      2)Formdata Example  use form data i think your error will be solve 

             let formdata = new FormData()

        formdata.append("Api variable",your post variable)
        formdata.append("name",this.state.name)
        formdata.append("email, this.state.email)
        formdata.append("password",this.state.password) 

       fetch('http://192.168.1.116/Restaurants/Registration.php', {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'multipart/form-data'
                        },
                        body:formdata


                    }).then(res => res.json())
                        .then(res => {


                            console.log('Data RESPONCE::', res);
           }

答案 2 :(得分:1)

then((response) => response.json())
                   ^^^^^^^^^^^^^ I think this is the problem

当您使用fetch API时,状态代码不等于2xx的响应将不会进入catch,因此您可以JSON.parse某些内容,例如HTML页面或纯文本流。

在将响应解析为JSON之前,应检查是否response.ok === true

答案 3 :(得分:0)

此错误的可能原因是您的服务器未返回无效JSON的内容(可能根本不是JSON,如404页面或类似内容)。

答案 4 :(得分:0)

如果您将请求Content-Type设置为application/json,则可能会发送预检请求以检查CORS。

在我的React应用程序(不是React-Native)中,我遇到了跨域问题。我的服务器不支持预检请求,因此响应如下:

{ body: null, status: 0, ok: false, }

导致response.json()失败,即使我在Chrome开发工具中获得了预期的JSON响应。

就我而言,我将请求Content-Type更改为application/x-www-form-urlencoded,不需要预检请求。它按预期工作。

这可能对您的情况没有帮助,但我希望它能给您一些见解。

答案 5 :(得分:0)

记录responseData。 API可能会返回无效数据。