我正在使用Positionstack API在 Android 上使用定位功能構建我的 APP。當我在本地環境中的 java 上測驗它時,該 API 運行良好。但是,當我通過活動在 Android Studio 上發送請求時,它會不斷回傳語法錯誤訊息和錯誤 400 代碼。
錯誤資訊
I/System.out: 400
I/System.out: {"error":{"code":"bad_request","message":"Could not decode value from JSON format. Error was: \u0022Syntax error\u0022."}}
發送請求的類別。它在本地環境中運行良好,但在模擬器上失敗。它建立一個 HttpUrlConnection 并使用 GET 方法從 API 檢索結果。它在 Android Studio 模擬器上回傳 400 狀態碼。
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class NetTest {
public static String sendRequest(String urlParam, String coordinate){
HttpURLConnection con = null;
BufferedReader buffer = null;
StringBuffer resultBuffer = null;
InputStream is;
try{
// prepare the params and send request
URL url = new URL(urlParam);
con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(5000);
con.setReadTimeout(5000);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type","application/json;charset=UTF-8");
con.setDoOutput(true);
con.set
// DataOutputStream wr = new DataOutputStream(con.getOutputStream());
// wr.writeBytes("access_key=xxx");
// wr.writeBytes("query=-33.7,127");
// wr.flush();
// wr.close();
System.out.println("message out");
// receive response
int responseCode = con.getResponseCode();
System.out.println(responseCode);
if (responseCode == 200) {
is = con.getInputStream();
}else {
is = con.getErrorStream();
}
resultBuffer = new StringBuffer();
String line;
buffer = new BufferedReader(new InputStreamReader(is,"UTF-8"));
while ((line = buffer.readLine()) != null){
resultBuffer.append(line);
}
return resultBuffer.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
public static void main(String[] args) {
String coordinate = "-33.7,127";
String url = "http://api.positionstack.com/v1/reverse";
System.out.println(sendRequest(url,coordinate));
}
}
清單
<application
android:usesCleartextTraffic="true">
...
</application>
<uses-permission android:name="android.permission.INTERNET" />
非常感謝!
問題可能是Android的編碼方式,但是不知道怎么改,甚至看不到。
uj5u.com熱心網友回復:
使用此代碼塊-> 首先創建 jsonObject 并添加您的鍵值,然后在輸出流中設定。您可以使用此鏈接作為參考 -> https://www.baeldung.com/httpurlconnection-post
JSONObject jsonObject = new JSONObject();
jsonObject.put("access_key", "Enter your access key here");
jsonObject.put("query", "Enter your query string here");
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
String jsonString = jsonObject.toString();
byte[] input = jsonString.getBytes(StandardCharsets.UTF_8);
wr.write(input, 0, input.length);
wr.flush();
wr.close();
還要檢查記錄器在請求正文中發送的內容,在記錄器中使用 okhttp 作為搜索字串
uj5u.com熱心網友回復:
感謝@abhishekrajak。我認為他的回答可以解決這種情況下的大多數問題。
但是,就我而言,我從 API 收到了錯誤 403 狀態代碼,表明我的訂閱無法使用此服務。我認為問題在于使用 HttpUrlConnection 的 OutputStream 會自動將您的請求方法從“GET”轉移到“POST”,而我的訂閱只能接收“GET”服務。
無論如何,毫無疑問@abhishekrajak 的答案可以成功地以正確的編碼傳遞引數。
我通過使用替代 API 解決了這個問題。最初的 API 可能不是一個好的選擇。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/525313.html
標籤:爪哇安卓api仿真
上一篇:執行API呼叫的問題
