0
votes

I tested .net web API with postman is working but I try to use okhttp3 and retrofit2 in android. Both of them I got internal server error 500. What wrong it is? What should I do?

Gradle

implementation 'com.squareup.okhttp3:okhttp:3.4.1'

implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'

implementation 'com.squareup.retrofit2:retrofit:2.3.0'

implementation 'com.squareup.retrofit2:converter-gson:2.1.0'

Android Retrofit (When click button call uploadFile method)

 public interface UploadAPIs {
    @Multipart
    @POST("FileUpload")
    Call<ResponseBody> uploadFile(
            @Part ("description") RequestBody description,
            @Part MultipartBody.Part file);
}

public Boolean uploadFile(File file) {
RequestBody descriptionPart = RequestBody.create(MultipartBody.FORM, file.getName());

RequestBody filePart = RequestBody.create(MediaType.parse("image/gif"), file);
MultipartBody.Part fileMulti = MultipartBody.Part.createFormData("file"
, file.getName(), filePart);

Retrofit.Builder builder = new Retrofit.Builder()
        .baseUrl("http://xxxxxxxxxx/api/FileExplorerApi/")
        .addConverterFactory(GsonConverterFactory.create());

Retrofit retrofit = builder.build();

UploadAPIs uploadAPIs = retrofit.create(UploadAPIs.class);

Call<ResponseBody> call = uploadAPIs.uploadFile(descriptionPart, fileMulti);
call.enqueue(new Callback() {
    @Override
    public void onResponse(Call call, Response response) {
        if (!response.isSuccessful()) {
            // Handle the error
            String error = response.errorBody().toString();
            return false;
        }else{
            String responseStr = response.body().toString();
            return true;
        }
    }
    @Override
    public void onFailure(Call call, Throwable t) {
    }
});
}

I got response internal server error (Android studio Debugging mode) code=500 internal server error

Android okhttp3(When click button call uploadFile method)

public Boolean uploadFile(File file) {  
    OkHttpClient client = new OkHttpClient();
    RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
            .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file))
            .build();

    Request request = new Request.Builder()
            .url("http://xxxxxxxxxx/api/FileExplorerApi/FileUpload")
            .post(body)
            .addHeader("content-type", "multipart/form-data")
            .addHeader("Content-Type", "multipart/form-data,image/gif")
            .addHeader("cache-control", "no-cache")
            .addHeader("Postman-Token", "58564c84-b8a7-4455-b346-4606ce696675")
            .build();

    client.newCall(request).enqueue(new Callback() {

        @Override
        public void onFailure(final Call call, final IOException e) {
            // Handle the error
        }

        @Override
        public void onResponse(final Call call, final Response response) throws IOException {
            if (!response.isSuccessful()) {
                // Handle the error
                return false;
            }else{
                String responseStr = response.body().string();
                return true;
            }
            // Upload successful
        }
    });
}

.net Web Api(Web api controller)

[HttpPost]
[Route("~/FileExplorerApi/FileUpload")]        
public HttpResponseMessage Upload()
{

    var request = HttpContext.Current.Request;            
    var file = request.Files["file"];

    string filename = DateTime.Now.ToString("yyyyMMddHHmmssFFF_") + file.FileName;

    file.SaveAs(@"c:\Projects\FileExplorer\Gif\" + filename);

    return new HttpResponseMessage(HttpStatusCode.OK);
}

Postman Result enter image description here

1
i think it's because you are sending something wrong. can you say in which format you recieve data?Jins Lukose
@JinsLukose I got response Internal server error 500. I already showed the image above.B M

1 Answers

1
votes

Finally, I got an answer. My .net project is MVC existing web project. I added API controller to that project that why I got that problem. I thought postman result is fine android also should be fine. My solution is to create the new .net web API only project.

The following answer is just sharing for my improvement.
I changed the new HTTP client loopj library that one is easier than previous both of the libraries.

RequestParams params = new RequestParams();

try {
    params.put("file", file);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
AsyncHttpClient client = new AsyncHttpClient();
client.post("http://xxxxxxxxxx/api/FileExplorerApi/Upload?sub=Boomerang", params, new AsyncHttpResponseHandler() {

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
        System.out.println("statusCode "+statusCode);//statusCode 200
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

    }
});

I will upload a big size file that why I need to make configuration at .net MVC web API project. Following configuration need to do for upload upsize file.(Web.config)

<system.web>    
    <httpRuntime maxRequestLength="2097152"/>    
</system.web>
<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="1073741824"/>
      </requestFiltering>
    </security>
<system.webServer>