React Native - 获取POST不起作用

时间:2017-01-12 06:29:57

标签: javascript post react-native fetch

我遇到了很大麻烦,让我的提取POST调用可以在iOS上运行。我的标准Fetch调用工作,Fetch POST调用在Android上工作正常,但不适用于iOS。

出现的错误是“可能未处理的承诺拒绝(id:0):意外的令牌<在位置0的JSON中”

它实际上将后期数据保存到我的服务器,但会抛出该错误。

我尝试在API调用之前使用 <?xml version="1.0" encoding="UTF-8"?> <root> <imageLink rowNum="1"> <url rowNum="1" colNumber="1">aa</url> <imageTypeCode rowNum="1" colNumber="2">PRODUCT_IMAGE</imageTypeCode> <languageCode rowNum="1" colNumber="3">en</languageCode> <languageCode rowNum="2" colNumber="3">fr</languageCode> </imageLink> <imageLink rowNum="3"> <url rowNum="3" colNumber="1">bb</url> <imageTypeCode rowNum="3" colNumber="2">PRODUCT_IMAGE</imageTypeCode> <languageCode rowNum="3" colNumber="3">fr</languageCode> <commTest rowNum="3"> <languageCode rowNum="3" colNumber="4">fssdr</languageCode> <languageCode rowNum="4" colNumber="4">fr</languageCode> <dummy rowNum="3" colNumber="5">DDDUMM</dummy> </commTest> <commTest rowNum="5"> <languageCode rowNum="5" colNumber="4">fd777r</languageCode> <languageCode rowNum="6" colNumber="4">fr777</languageCode> <dummy rowNum="5" colNumber="5">DDD777UMM</dummy> </commTest> <changedName rowNum="3"> <languageCode rowNum="3" colNumber="4">fd777r</languageCode> <languageCode rowNum="4" colNumber="4">fr777</languageCode> <dummy rowNum="3" colNumber="5">DDD777UMM</dummy> </changedName> </imageLink> </root> 调试网络请求,并在我的chrome调试工具中使用CORS。从那里我可以看到它一个接一个地发出两个帖子。第一个类型为“OPTIONS”,而第二个类型为“POST”。应该注意的是,在使用CORS和上面的代码行时,调用在App中工作。

我很困惑,已经筋疲力尽了。

我用于参考的代码如下。

GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;

5 个答案:

答案 0 :(得分:4)

您可以轻松地使用以下代码进行POST请求。你只需要    只替换参数名称和值以及您的URL。

var details = {
    'userName': 'test@gmail.com',
    'password': 'Password!',
    'grant_type': 'password'
};

var formBody = [];
for (var property in details) {
  var encodedKey = encodeURIComponent(property);
  var encodedValue = encodeURIComponent(details[property]);
  formBody.push(encodedKey + "=" + encodedValue);
}
formBody = formBody.join("&");

fetch('http://identity.azurewebsites.net' + '/token', {
  method: 'POST',
  headers: {
   'Accept': 'application/json',
   'Content-Type': 'application/x-www-form-urlencoded'
 },
 body: formBody
 }).  
 .then((response) => response.json())
        .then((responseData) => {
            console.log("Response:",responseData);
         }).catch((error) => {
                Alert.alert('problem while adding data');
            })
        .done();

答案 1 :(得分:2)

我猜你收到的回复是用HTML写的。尝试:

 console.warn(xhr.responseText)


然后看一下回复。

此外,IOS需要HTTPS。

修改:可能重复:"SyntaxError: Unexpected token < in JSON at position 0" in React App

答案 2 :(得分:2)

如果JSON.stringify不起作用,请尝试使用FormData。

import FormData from 'FormData';

var formData = new FormData();
formData.append('key1', 'value');
formData.append('key2', 'value');

let postData = {
    method: 'POST',
    headers: {
        'Accept': 'application/json',
        'Content-Type': 'multipart/form-data'
    },
    body: formData
}

fetch(api_url, postData)
.then((response) => response.json())
.then((responseJson) => { console.log('response:', responseJson); })
.catch((error) => { console.error(error); });

答案 3 :(得分:0)

服务器node.js?

<button class="widget-button toggle-like has-like fade-out no-text" aria-label="شما این نوشته را پسندیده‌اید" title="شما این نوشته را پسندیده‌اید" disabled="true">
    <i class="fa fa-heart" aria-hidden="true"></i>
</button>

答案 4 :(得分:0)

这是一个日期适用于我的例子!
诀窍是&#34; =&#34;平等和&#34;&amp;&#34;符号,并且必须在body对象中以字符串格式。 找到一种方法来创建该字符串并将其传递给正文。

====================================

fetch('/auth/newdate/', {
            method: 'POST',
            mode: 'cors',
            redirect: 'follow',
            body: "start="+start.toLocaleString()+"&end="+end.toLocaleString()+"",
            headers: new Headers({
                "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
            })
        }).then(function(response) {
            /* handle response */
            if(response.ok) {
              response.json().then(function(json) {
                let releasedate = json;
                //sucess do something with places
                console.log(releasedate);
              });
            } else {
              console.log('Network failed with response ' + response.status + ': ' + response.statusText);
            }
        }).catch(function(resp){ console.log(resp) });