我到处搜索但我找不到答案,有没有办法发出简单的HTTP请求?我想在我的某个网站上请求PHP页面/脚本,但我不想显示该网页.
如果可能的话我甚至想在后台(在BroadcastReceiver中)这样做
我正在尝试使用Retrofit 2.0对服务器进行HTTP POST
MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain");
MediaType MEDIA_TYPE_IMAGE = MediaType.parse("image/*");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
imageBitmap.compress(Bitmap.CompressFormat.JPEG,90,byteArrayOutputStream);
profilePictureByte = byteArrayOutputStream.toByteArray();
Call<APIResults> call = ServiceAPI.updateProfile(
RequestBody.create(MEDIA_TYPE_TEXT, emailString),
RequestBody.create(MEDIA_TYPE_IMAGE, profilePictureByte));
call.enqueue();
Run Code Online (Sandbox Code Playgroud)
服务器返回错误,指出文件无效.
这很奇怪,因为我试图在iOS上使用相同的格式上传相同的文件(使用其他库),但它上传成功.
我想知道使用Retrofit 2.0上传图像的正确方法是什么?
在上传之前我应该先将它保存到磁盘吗?
谢谢!
PS:我已经将改造用于其他不包含图像的Multipart请求,并且已成功完成.问题是当我试图在主体中包含一个字节时.
我在localhost中创建了一个php脚本,我正在连接它,httpClient但是我遇到了问题.
请告诉我如何从模拟器连接到localhost的php文件?
我正在研究Android上的应用.我正在使用httpcore 4.3.3.我尝试使用时会得到这个ContentType.parse(string)
java.lang.NoSuchFieldError: No static field INSTANCE of type Lorg/apache/http/message/BasicHeaderValueParser; in class Lorg/apache/http/message/BasicHeaderValueParser; or its superclasses (declaration of 'org.apache.http.message.BasicHeaderValueParser' appears in /system/framework/ext.jar)
Run Code Online (Sandbox Code Playgroud)
我做了一些谷歌搜索,我理解为什么我得到错误,但我不确定如何解决它.从我读过的内容来看,似乎ContentType试图利用Android附带的BasicHeaderValueParser,而该类还没有INSTANCE字段.有什么帮助吗?
这些是相关的进口:
compile('org.apache.httpcomponents:httpmime:4.3.6') {
exclude module: 'httpclient'
}
compile 'org.apache.httpcomponents:httpcore:4.3.3'
Run Code Online (Sandbox Code Playgroud) 我们升级到Retrofit 2.0并遇到了这个奇怪的问题.
我有一个方法来记录用户
public interface ApiInterface {
@Multipart
@POST("user/login/")
Call<SessionToken> userLogin(@Part("username") String username, @Part("password") String password);
}
Run Code Online (Sandbox Code Playgroud)
当我查看服务器端的键值POST params时,它们就像这样打印
username : "brian"
password : "password"
Run Code Online (Sandbox Code Playgroud)
使用改造1.9的相同方法K:V对看起来像
username : brian
password : password
Run Code Online (Sandbox Code Playgroud)
它正在为POST变量添加文字引号
如果我使用任何其他休息客户端,变量打印就像没有引号的第二种方式.
以下是我使用拦截器构建Retrofit实例的方法
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
// Customize the request
Request request = original.newBuilder()
.header("Accept", "application/json")
.header("Authorization", myPrefs.accessToken().getOr(""))
.method(original.method(), original.body())
.build();
Response response = chain.proceed(request);
// Customize or return the response …Run Code Online (Sandbox Code Playgroud) 我是Android编程的新手,也在使用Retrofit.我已就这个主题做了大量研究,但未能找到特定于我需求的解决方案.我正在使用我们的API并尝试发出POST请求.我使用以下非Retrofit代码成功实现了此目的:
private class ProcessLogin extends AsyncTask<Void, String, JSONObject> {
private ProgressDialog pDialog;
String email,password;
protected void onPreExecute() {
super.onPreExecute();
inputEmail = (EditText) findViewById(R.id.email);
inputPassword = (EditText) findViewById(R.id.password);
email = inputEmail.getText().toString();
password = inputPassword.getText().toString();
pDialog = new ProgressDialog(LoginActivity.this);
pDialog.setTitle("Contacting Servers");
pDialog.setMessage("Logging in ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
protected JSONObject doInBackground(Void... params) {
HttpURLConnection connection;
OutputStreamWriter request = null;
URL url = null;
String response = null;
String parameters = "username="+email+"&password="+password;
try
{
url = new URL("http://.../api/login");
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true); …Run Code Online (Sandbox Code Playgroud) android android-networking android-asynctask androidhttpclient retrofit
在SpeakerDeck(https://speakerdeck.com/pareshmayani/lazy-android-developers-be-productive)的Paresh Mayani演讲中,他说最好使用OkHttp或Retrofit代替AsyncTask使用DefaultHttpClient.
我的问题是为什么?
为什么他们更快?
那些也是基于默认android类的库吗?
OkHttp和Retrofit有什么区别?
谢谢!
android android-networking androidhttpclient retrofit okhttp
我有两个域:foo.net和bar.com.它们都具有SSL证书,并且在所有桌面和移动浏览器中都能很好地运行.它们托管在使用nginx配置的同一台服务器上.
但是,当我从本机Android应用程序中向域发出请求时,它会以某种方式从错误的域获取证书!这会导致IO异常:
request = new HttpPost("https://foo.net/api/v1/baz");
request.setHeader("Authorization", "user:pass");
response = httpClient.execute(request);
Run Code Online (Sandbox Code Playgroud)
...
javax.net.ssl.SSLException: hostname in certificate didn't match: <foo.net> != <bar.com> OR <bar.com> OR <www.bar.com>
什么会导致android/java尝试使用证书bar.com时,其他每个措施似乎表明服务器配置正确?nginx访问或错误日志中没有任何内容.bar.com在我的android项目中没有提到任何地方.
编辑:我不知道为什么,但似乎服务器正在使用证书为bar.com服务器IPhttps://198.245.xx.xxx
我的要求是使用PUT,发送标题和正文到服务器,它将更新数据库中的内容.
我刚刚阅读了okHttp文档,我试图使用他们的POST示例,但它不适用于我的用例(我认为这可能是因为服务器要求我使用PUT而不是POST).
这是我的方法POST:
public void postRequestWithHeaderAndBody(String url, String header, String jsonBody) {
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, jsonBody);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.post(body)
.addHeader("Authorization", header)
.build();
makeCall(client, request);
}
Run Code Online (Sandbox Code Playgroud)
我试图搜索okHttp示例使用PUT没有成功,如果我需要使用PUT方法是否还有使用okHttp?
我正在使用okhttp:2.4.0(以防万一),感谢任何帮助!
android android-networking androidhttpclient retrofit okhttp
我最近将我的项目从Eclipse迁移到Android Studio(我还没有完全控制这个IDE).在这个项目中,我有一个文件上传器AsyncTask,它通过http发送multipart.为此,我使用org.apache.httpcomponents.我创建了以下依赖项:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'org.apache.httpcomponents:httpcore:4.4'
compile 'org.apache.httpcomponents:httpmime:4.4'
...
}
Run Code Online (Sandbox Code Playgroud)
在我的java AsyncTask代码中:
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody(...);
builder.addBinaryBody(...);
builder.addBinaryBody(...);
HttpEntity entity = builder.build(); // < throw exception
Run Code Online (Sandbox Code Playgroud)
我在启动上传时获得的异常:
Caused by: java.lang.NoSuchFieldError: org.apache.http.message.BasicHeaderValueFormatter.INSTANCE
at org.apache.http.entity.ContentType.toString(ContentType.java:153)
at org.apache.http.entity.mime.MultipartFormEntity.<init>(MultipartFormEntity.java:52)
at org.apache.http.entity.mime.MultipartEntityBuilder.buildEntity(MultipartEntityBuilder.java:226)
at org.apache.http.entity.mime.MultipartEntityBuilder.build(MultipartEntityBuilder.java:230)
Run Code Online (Sandbox Code Playgroud)
我认为android.jar > httpcomponents和org.apache.httpcomponents依赖之间存在冲突但我没有找到解决问题的解决方案.