1

I am getting HTTP status error code 405 on sending post requests from the real devices but it's working inside the postman.

The URL is: https://amapp.adtestbed.com/api/post-survey

The following is the form data I am using

FormData formData = FormData.fromMap({
      
        'user_id': id,
        'is_collection':
            jobDetailsResponseModel.jobData.jobStatus == '8' ? 1 : 0,
        'job_id': jobDetailsResponseModel.jobData.id,
        'job_no': bookingIdController.text.toString(),
        'sender_name': senderNameController.text.toString(),
        'reciever_name': recieverNameController.text.toString(),
        'sender_phone': senderPhoneController.text.toString(),
        'reciever_phone': recieverPhoneController.text.toString(),
        'sender_address': senderAddressController.text.toString(),
        'reciever_address': recieverAddressController.text.toString(),
        'sender_signature_data':
            "data:image/jpeg;base64," + base64Imagesendersign,
        'receiver_signature_data':
            "data:image/jpeg;base64," + base64Imagerecieversign,
        'location': currentLocation,
      
      'images[]': uploadimages,
      'maked[]': makedlist,
      'model[]': modallist,
      'rego[]': regolist,
      'speedo[]': speedolist,
      'is_drivable[]': isdrivablelist,
      'goods_inside[]': goodsinsidelist,
      'external_condition[]': externalconditionlist,
      'interior_condition[]': internalconditionlist,
      'survey_image[]': surveyimagelist,
      'comments[]': commentlist
    }); 

Here images field is a multipart form list. And doing requests as follows

final response = await Dio().request(
        'https://amapp.adtestbed.com/api/post-survey',
        data: formData,
        options: Options(
          headers: {
            "Accept": "application/json",
          },
          method: 'POST',
        ),
      );

also used the following code to check but still not working

final response = await Dio().post(
        'https://amapp.adtestbed.com/api/post-survey',
        data: formData,
        options: Options(
          // headers: {
          //   // "Accept": "application/json",
          //   // 'Content-Type': 'application/x-www-form-urlencoded'
          // },
          method: 'POST',
        ),
      );

When I am sending the form without an images field then it's submitting perfectly and giving 200 status but when I am sending it's with an images field that contains a multipart form list then it's returning 405 status code. End giving the error like the get method not supported only support post method. I also checked the backend code but no error from that's side because it's giving an error before sending the request. I also checked if there were some null data that created errors but not a single field is null.

But when I am doing both cases in postman then it's working fine.

This is the postman link:

https://drive.google.com/file/d/1hTmDC2aQ7vTMxSnzwaeRqd9gv7UbPWhR/view?usp=sharing

These are some images of the postman

enter image description here

enter image description here

enter image description here

enter image description here

MORE AKASH
  • 283
  • 1
  • 8
  • you should pass data this way for form data along with post request: https://stackoverflow.com/questions/57846215/how-make-a-http-post-using-form-data-in-flutter – Hardik Mehta May 17 '22 at 08:13

2 Answers2

1

https://stackoverflow.com/a/64235806/11623001

Check this out I had a similar issue too before, and I also noticed that you are not adding your authorization token to your header which may explain why you are getting 405 which would mean you can't have access.

I tried to recreate your issue on my end but the authorization token is expired, I'm getting a 401, but here is the code:

    void postSome() async {
        String base64 = 
      
//This base64 is shortened     "data:image/png;base64,...+WZm/et53efvWO6Tuc6rH7kUXy1lxs+/61t7dMg6VAvURAAAAQHMQogDAbE6dlLXtft/F3cuvkJNbetbn7VWrpUUX+mvEtqdHvgAAAABoOf8P3x1uDPELl4UAAAAASUVORK5CYII=";
        FormData formData = FormData.fromMap({
          'user_id': 139,
          'is_collection': "1" == '8' ? 1 : 0,
          'job_id': "248",
          'job_no': "60036JL#1",
          'sender_name': "test",
          'reciever_name': "test",
          'sender_phone': "1234567890",
          'reciever_phone': "1234567890",
          'sender_address': "test",
          'reciever_address': "test",
          'sender_signature_data':
             base64,
          'receiver_signature_data': base64,
          'location': "32, Gopal Nagar, Om Nagar, Gopal Nagar Society, Parvat Patiya, Surat, Gujarat 395010, India\n",
          'images[]': "/D:/App/Logicwind/GitLAb/whiteboard-digitization/test_images/w11.jpg",
          'maked[]': "test",
          'model[]': "test",
          'rego[]': "test",
          'speedo[]': "123",
          'is_drivable[]': "1",
          'goods_inside[]': "1",
          'external_condition[]': "3",
          'interior_condition[]': "3",
          'survey_image[]': base64,
          'comments[]': "test"
        });
    
        final response = await Dio().request(
          'https://amapp.adtestbed.com/api/post-survey',
          data: formData,
          options: Options(
            headers: {
              'Accept': "application/json",
              'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIzIiwianRpIjoiNTlkNzNlZjE4YzcxNGJjMWM1ZjE0ZGQxOWE1OWZmNmQ1YjVhNDViNDIwNzlkODY4ZmJkOGRmNjJlOGM4MDQzNmVjYmIxZjc4MjM5MmZiOGIiLCJpYXQiOjE2MjgxNzY5NTAsIm5iZiI6MTYyODE3Njk1MCwiZXhwIjoxNjU5NzEyOTUwLCJzdWIiOiI0NiIsInNjb3BlcyI6W119.lfnzUvq_LwYtBUQ-t6S_mKXEoM6er6ZzCuTUoHnqz9wwrdLOcu6x9CEixqMRvI-RWtSoiMO5KCYZsgagayGW5slYk6zAAa0V5fCjkRipqqus6mXe6nowtcXs_2V9ucjVoH4Evkb9lFBlE1rlpxKgcGXTcx4UgQs8kjJ5Wm4A8omedza_hUQPN9KUAfhhBDeL9hq-DkC7QbLu_YxnG5g-AETKhbJu8T4HWKqkh9NKGbNlvs1oi_nD81F1w8uSteY-UOgDJyUoGJxzoD6xmEv3J4mkrdr1ZbG88EzTyk3zngwBp9eWcLHhMS2psxArOnOnWusweJJ5uZiWiu2VIL7fWmV5b6G4OCvvkba5eXmw8iAvACACuCGQtOcGdN_euUgyfM9z9a8QbK8M2I-ux4GGY0ejCamFEJZCTwyBCxmLIrP4XjQoeL71WT1YBOgSZwDjA6qrAfL_fLwbEYQYbLIF8fLUmDOWRKBIaJLSVNG2x0Gl5LLXTiTZAzRRtJlSxZ4-Vid4hQJX39lohp-47XPAxvHnNTxiLw_aAG3SruFZ_rtdX4xnNbV3hSI825CD5dBeQC5iE-hiLXDWDXelM_q2fSD1rez62XQZGp1KfvlwowxAWgIghTfSH_E52h6mdoHEo9q73UJNYDz_F9Sj8EOfY3VWtmN6HMmcs4HZht36qX4',
            },
            method: 'POST',
          ),
        );
        print(response.statusCode);
      }
Denzel
  • 942
  • 5
  • 14
  • Is authorization required for post request because in my request there is no authorization token needed I also opted out in the postman? – MORE AKASH May 17 '22 at 09:17
  • Your post man request had one check. If your POST request doesn't have one then there is no need, but if it does it's absolutely necessary. Check you headers tab in postman and you'll see that you are actually using a header. – Denzel May 17 '22 at 09:25
  • That authorization in postman was an old API token. But my API does not have any authorization it works without it. – MORE AKASH May 17 '22 at 09:28
  • Alright, let me review – Denzel May 17 '22 at 09:37
  • No thanks, I go through the old API it's have authorization token and after passing new token it's solved. Thanks again. – MORE AKASH May 17 '22 at 09:52
1

It looks like below two fields are files not a form data.

'sender_signature_data': "data:image/jpeg;base64," + base64Imagesendersign
'receiver_signature_data': "data:image/jpeg;base64," + base64Imagerecieversign

You should add those as file fields like this


"sender_signature_data": await MultipartFile.fromFile(sender_signature_path,
      filename: fileName, contentType: MediaType(mimee, type))
  }),
"receiver_signature_data":await MultipartFile.fromFile(reciever_signature_path,
      filename: fileName, contentType: MediaType(mimee, type))
  })

cedric
  • 331
  • 1
  • 6
  • Is authorization required for post request because in my request there is no authorization token needed I also opted out in the postman? – MORE AKASH May 17 '22 at 09:18
  • Most servers deny to respond unless authorization header is sent. It is kind of letting server know who is invoking the request. i have gone through your postman collection it does have authorization header. copy Authorization header from postman in authorization tab. – cedric May 17 '22 at 09:20
  • That authorization in postman was old api token But my API does not have any authorization it' works without it. – MORE AKASH May 17 '22 at 09:26
  • No thanks, I go through the old API it's have authorization token and after passing new token it's solved. Thanks again. – MORE AKASH May 17 '22 at 09:53
  • Hey, issue seems to be coming files. you are attaching signatures as form fields. where as those needs to be a file. Use multipart in dio to resolve this. Updated solution. check – cedric May 17 '22 at 10:02