HttpEntity 目标主机不能为空

HttpEntity target host must not be null

我正在尝试从我的 android 虚拟机执行 POST 到我的开发主机上 运行 的 Web API。 我可以执行 GET 请求和 "normal" JSON POST 但是当我尝试将其作为 MultiPart 执行时,它变得很棘手。

经过一些研究,我从 Muhammad Babar Post multipart request with Android SDK 那里找到了一个很好的答案。这对 HTTP 实体有帮助。

所以,错误:
java.lang.IllegalStateException: 目标主机不能为空,也不能在参数中设置。方案=null,主机=null,路径=http://10.0.2.2:53918/api/Problems

当代码到达:

HttpResponse response = client.execute(post);

我的代码:

public class MainActivity extends Activity {
    private DefaultHttpClient mHttpClient;
    private String result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public void ServerCommunication(View view) {
        HttpParams params = new BasicHttpParams();
        params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
        mHttpClient = new DefaultHttpClient(params);
        uploadUserPhoto();
    }



    public void uploadUserPhoto() {
        try{
            String uri = URLEncoder.encode( "http://10.0.2.2:53918/api/Problems","UTF-8");
            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost(uri);


            MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
            entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

            entityBuilder.addTextBody("Id", "7");
            entityBuilder.addTextBody("DateReported", "22/04/2015");
            entityBuilder.addTextBody("Category", "C");

            HttpEntity entity = entityBuilder.build();
            post.setEntity(entity);
            HttpResponse response = client.execute(post);
            HttpEntity httpEntity = response.getEntity();
            result = EntityUtils.toString(httpEntity);
            Log.v("result", result);
        }

        catch(Exception e)
        {
            e.printStackTrace();
        }



    }

请帮我解决上面的IllegalStateException

URLEncoder 用于编码 query parameters 而不是创建具有方案、主机和端口的 URI。而是将 URI 移动到 HttpPost 的构造函数,例如 new HttpPost("http://10.0.2.2").

此外,此 API 在 API 级别 22 中已弃用,请参阅 documentation 以获取较新的替代方案 API。