来自angular的$ http.post到达php,但是在angularjs中没有收到响应

时间:2015-11-19 08:43:58

标签: php angularjs

我有这个奇怪的问题,你已经做了几千次的事情,但这次不行。我已经服用了两天而无法修复它。

所以我的代码非常简单:

js:

$http.post('datas/test.php', data)
    .success(function(response) 
             console.log(response);
     })
    .error(function() {
             console.log("error");
     });

test.php:

<?php
$user=json_decode(file_get_contents('php://input'));
echo json_encode($user);
?>

当我在$ http.post之前执行console.log(数据)时,它包含一个带有两个字段的对象,这两个字段都是字符串但是console.log(响应)给我一个null,所以每次我尝试访问一个像$ user-&gt;这样的变量给我一个错误。

我有第二个问题也很奇怪:当我运行我的应用程序并调用$ http.post时,它给了我之前说过的所有错误,但如果我再试一次,那么$ http。在我重启服务器之前,帖子根本不会打电话(它给我一个糟糕的网关)。

我测试了很多东西,比如改变我调用文件的方式:

$http({
    method: 'POST',
    url: 'datas/test.php',
    data: data,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'} // Or 'application/json'
});

但这给了我完全相同的行为。

提前感谢您帮助我度过美好的一天! ;)

PS:我正在使用PHPStorm以防万一与服务器重启事件有关。

3 个答案:

答案 0 :(得分:1)

如果您使用内容类型'application / x-www-form-urlencoded',您应该以urlencoded格式传递数据(即“var1 = val1&amp; var2 = val2”)。

否则,如果你使用'application / json',你可以直接传递你的javascript对象。

如果我能帮助你,请告诉我。

再见

答案 1 :(得分:1)

第一种方法

要以正确的方式使用有角度的$ http.post,请使用.then方法而不是成功方法来正确承诺。

$http.post('/someUrl', data, config).then(successCallback, errorCallback);

请使用$ http.post

查看angular documentation

第二种方法

看起来数据转换不正确。默认情况下,$ http服务将通过将数据序列化为JSON来转换传出请求,然后将其与内容类型&#34; application / json&#34;一起发布。但是您希望将值作为FORM帖子发布,因此您需要更改序列化算法并使用内容类型发布数据,&#34; application / x-www-form-urlencoded&#34;。

遵循this link

的代码参考
var request = $http({
method: "post",
url: "datas/test.php",
transformRequest: transformRequestAsFormPost,
data: {
  id: 4,
  name: "Test",
  status: "Something"
}
});

// Store the data-dump of the FORM scope.
request.success(
function( html ) {

$scope.cfdump = html;

}
);

TransformRequestAsFormPost实现

app.factory(
"transformRequestAsFormPost",
function() {

// I prepare the request data for the form post.
function transformRequest( data, getHeaders ) {

var headers = getHeaders();

headers[ "Content-type" ] = "application/x-www-form-urlencoded; charset=utf-8";

return( serializeData( data ) );

}


// Return the factory value.
return( transformRequest );


// ---
// PRVIATE METHODS.
// ---


// I serialize the given Object into a key-value pair string. This
// method expects an object and will default to the toString() method.
// --
// NOTE: This is an atered version of the jQuery.param() method which
// will serialize a data collection for Form posting.
// --
// https://github.com/jquery/jquery/blob/master/src/serialize.js#L45
function serializeData( data ) {

// If this is not an object, defer to native stringification.
if ( ! angular.isObject( data ) ) {

return( ( data == null ) ? "" : data.toString() );

}

var buffer = [];

// Serialize each key in the object.
for ( var name in data ) {

if ( ! data.hasOwnProperty( name ) ) {

continue;

}

var value = data[ name ];

buffer.push(
encodeURIComponent( name ) +
"=" +
encodeURIComponent( ( value == null ) ? "" : value )
);

}

// Serialize the buffer and clean it up for transportation.
var source = buffer
.join( "&" )
.replace( /%20/g, "+" )
;

return( source );

}

}
);

答案 2 :(得分:0)

我在这里遇到的问题来自我之前在JS中打开的FileReader:

reader.readAsBinaryString($scope.file);
    reader.onload = function (e) {
       //stuff
    };

readAsBinaryString函数使得file_get_contents(&#34; php:// input&#34;)无法正常工作。

一旦替换为

    reader.readAsDataURL($scope.file);

每件事情都很好。

感谢Giulio帮我解决了这个问题。