从Swift调用Express API时,会遇到413个错误



当我尝试访问我从iOS应用程序中制作的Express端点时,我会遇到413个错误,说有效负载太大了。这是我的节点代码。

router.post('/images/tags/nutritionalInformation/image/base64encoded', function (req, res) {
    var base64Stream = req.body.imageString;
    var imgDecodedBuffer = decodeBase64Image(base64Stream);
    // write to image file
    var prefix = guid().toString() + ".jpg";
    var filePath = './uploads/' + prefix;

    return s3fsImpl.writeFile(prefix, imgDecodedBuffer.data).then(function () {
        var s3BaseUrl = "https://s3.amazonaws.com/app/" + prefix;
        console.log(s3BaseUrl);
        app.models.predict('KEY', s3BaseUrl).then(
            function (response) {
                var responseJson = JSON.stringify(response.data.outputs[0].data.concepts);
                var data = collectTags(responseJson);
                data.then(function (value) {
                    res.json(value);
                });
            },
            function (err) {
                console.log(err);
            });
    });
})

我在Postman中对此进行了测试,当我将Base64编码的字符串附加到体内时,它可以正常工作!但是,当我尝试使用以下代码从Swift发送帖子电话时:

func getTags() {
        let image : UIImage = UIImage(named: "burger.jpg")!
        let imageData = UIImageJPEGRepresentation(image, 1.0)
        // base64 encode imagedata
        let prefix = "data:image/jpeg;base64,"
        let strBase64:String = prefix + (imageData?.base64EncodedString(options: .lineLength64Characters))!
        // Call tagging api https://foodenodeapp.herokuapp.com/api/images/tags/nutritionalInformation/image/base64encoded
                var request = URLRequest(url: URL(string: "https://foodenodeapp.herokuapp.com/api/images/tags/nutritionalInformation/image/base64encoded")!)
                request.httpMethod = "POST"
                let poststring = "imageString=" + strBase64

                let task = URLSession.shared.dataTask(with: request) { data, response, error in
                    guard let data = data, error == nil else {                                                 // check for fundamental networking error
                        print("error=(error)")
                        return
                    }
                    if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
                        print("statusCode should be 200, but is (httpStatus.statusCode)")
                        print("response = (response)")
                    }
                    print(data)
                    let responseString = String(data: data, encoding: .utf8)
                    print("responseString = (responseString)")
                }
                task.resume()
            }

但是,当我在Swift代码中打印出响应时,我会得到此响应:

nutritionalInformation/image/base64encoded } { status code: 413, headers {
    Connection = "keep-alive";
    "Content-Length" = 18;
    "Content-Type" = "text/html; charset=utf-8";
    Date = "Sun, 04 Dec 2016 20:18:15 GMT";
    Server = Cowboy;
    Via = "1.1 vegur";
    "X-Content-Type-Options" = nosniff;
    "X-Powered-By" = Express;
} }
18 bytes
responseString = Optional("Payload Too Largen")

所以我进行了一些研究,然后尝试更改app.js,这是我的根文件(逻辑代码在api.js中)。

app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({extended:true, limit: '50mb'}));
app.use(express.static(__dirname + '/public'));

app.get('/', function (req, res) {
  res.redirect('/api');
});
app.use('/api', require('./routes/api'));

但是,当此更改之后,当我以Swift运行该功能时,我现在会遇到500个错误。

解决此问题的任何帮助将不胜感激!

此问题来自服务器端。

如果您的服务器是Node JS,则进行更改为: -

    var express    = require('express')
   var bodyParser = require('body-parser')
   var app = express()
   app.use(bodyParser.json({ limit: '10mb' })) // change limit according to you.

对于其他服务器更改限制。