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。
我正在尝试从我的 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。